一、基本概念
頁:核心把物理頁作為記憶體管理的基本單元。mmu(記憶體管理單元)是管理記憶體,並把虛擬位址轉換為實體地址的硬體。mmu已頁大小為單位管理系統中的也不。
從虛擬記憶體的角度來看,頁就是最小單位。當時必須理解一點,page結構與物理頁相關,並非與虛擬頁相關。
系統中的每個物理頁都要分配乙個這樣的結構體。
struct page
unsigned long flags; //頁的狀態,比如頁是不是髒的,是不是被鎖定在記憶體中
atomic_t _count;//頁的引用計數,一般呼叫page_count()函式來檢查,不直接訪問
atomic_t _mapcount;
unsigned long private;
pgoff_tindex;
struct list_head lru;
void *virtual; //頁的虛擬位址
......
區:核心把頁劃分為不同 的區,核心使用區對具有相似特徵的頁進行分組。
linux中主要使用四種區:
zone_dma dma使用的頁
zone_dma32 dma使用的頁,只能被32位裝置訪問
zone_normal正常可定址的頁
zone_highem動態對映的頁
在x86-32上,zone_dma : <16mb,zone_normal: 16~896mb; zone_highem: > 896mb
每個區都使用struct zone表示,結構體較大,在中定義
二、記憶體分配
1、獲取頁
alloc_page(gfp_mask)只分配一頁,返回指向頁結構的指標
alloc_pages(gfp_mask, order)分配2^order個頁,返回指向頁結構的指標
__get_free_page(gfp_mask)只分配一頁,返回指向其邏輯位址的指標
__get_free_pages(gfp_mask, order) 分配2^order個頁,返回指向其邏輯位址的指標
get_zeroed_page(gfp_mask) 只分配一頁,
讓內容填充0,返回指向其邏輯位址的指標
void _free_pages(struct page*page, unsigned int order);
void free_pages(unsigned long addr, unsigned int order);
void free_page(unsigned long addr);
2、獲取較少位元組的連續實體地址記憶體
void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *ptr);
3、獲取非連續的實體地址記憶體
void *vmalloc(unsigned long size);
void vfree(const void *addr);
4、slab分頻器
struct kmem_cache *kmem_cache_create(const char *name, //快取記憶體的名字
size_t size, //快取記憶體中每個元素的大小
size_t align,// slab內第乙個物件的偏移,用了確保在業內進行特定的對齊
unsigned long flags,
void (*octor)(void *));// 快取記憶體的建構函式,在新的頁追加到快取記憶體時,建構函式才被呼叫
int kmen_cache_destroy(struct kmem_cache (cachep);
// 從快取中分配物件
void *keme_cache_alloc( struct kmem_cache , gfp_t flags);
// 釋放物件
void keme_cache_free( struct kmem_cache , void *objp);
linux 核心設計與實現相關
有待繼續補充。第一章 linux核心簡介 需要注意 核心開發其實並不難。第二章 從核心出發 核心開發需要注意 1 沒有c庫,c庫太大了 2 沒有記憶體保護機制 3 不要輕易使用浮點數 4 可移植的重要性 5 同步和併發 疑問 編譯和安裝核心?必須在linux下麼?其他機器安裝了gcc編譯器呢?能否編...
Linux核心設計與實現總結。
1.程序管理。本章主要是介紹程序的乙個靜態的狀態,包括系統如何組織程序。建立,啟動,到最後死亡的乙個概念性認識,沒有更加深刻的知識。2.程序排程。本章比較重要。1.搶占式排程策略。2.倆程序間上下文切換 有倆函式 switch mm 和 switch to倆函式完成此功能。具體細節需要閱讀其他書籍 ...
linux核心設計與實現 前言
認真閱讀原始碼很重要,應該鑽研並嘗試著手改一些 尋找乙個bug然後去修改它,改進你的硬體裝置的驅動程式 unix特點 作業系統 指系統中負責完成最基本功能和系統管理的部分。包括 核心 裝置驅動程式 啟動引導程式 命令列shell或其他種類的使用者介面 基本的檔案管理和系統工具。核心組成 中斷服務程式...