1. 程式人生 > >核心記憶體管理幾個重要的結構體與函式(一)

核心記憶體管理幾個重要的結構體與函式(一)

資料結構

        Linux記憶體主要採取頁式管理。所以需要表示出頁表的資料結構:

        typedef  struct { unsigned long pte_low; } pte_t;

pte_low裡面儲存頁面的實體地址。因為頁表是mmu用來定址實體記憶體中頁面的,如果儲存的是線性地址的話就毫無意義了。但是核心用來定址的時候只要是在開啟了分頁的情況下都應該使用虛擬地址。因為頁式地址轉換是硬體執行的(暫且不看分段)。Linux本身無法繞過這個過程。

        pte_low本身存放了實體地址的高20位。因為一個頁面是4KB大小,正好佔據12位,所以剩下12位(生成的實體地址的低12位直接拷貝了給出的線性地址的低12位)。Linux利用12位來記錄頁面的性質。但是在實際的實現中,並沒有直接利用pte_low的低12位。而是定義了另一個數據結構pgprot:

           typedef struct { unsigned long pgprot ;} pgprot_t ;

        單獨設定pgrprot_t是因為可以定義不同的頁面型別,方便頁表項的建立。在include/asm-i386/pgtable.h中可以發現確實定義了一些型別用來設定頁表項。

          那麼很明顯合成頁表項的方法就是 #define __mk_pte(page_nr,pgprot) __pte(page_nr<<PAGE_SHIFT | pgprot_val(pgprot))

PAGE_SHIFT=12;pgprot_val=pgprot_t.pgprot;__pte=(pte){(x)};這個巨集的意思就是page_nr左移12位後與pgprot進行或運算得到頁表項。

           要注意的是page結構體本身代表了物理頁面,它會和虛擬頁面管理產生互動。(未完)