資料結構
linux記憶體主要採取頁式管理。所以需要表示出頁表的資料結構:
typedef struct pte_t;
pte_low裡面儲存頁面的實體地址。因為頁表是mmu用來定址物理記憶體中頁面的,如果儲存的是線性位址的話就毫無意義了。但是核心用來定址的時候只要是在開啟了分頁的情況下都應該使用虛擬位址。因為頁式位址轉換是硬體執行的(暫且不看分段)。linux本身無法繞過這個過程。
pte_low本身存放了實體地址的高20位。因為乙個頁面是4kb大小,正好佔據12位,所以剩下12位(生成的實體地址的低12位直接拷貝了給出的線性位址的低12位)。linux利用12位來記錄頁面的性質。但是在實際的實現中,並沒有直接利用pte_low的低12位。而是定義了另乙個資料結構pgprot:
typedef struct pgprot_t ;
單獨設定pgrprot_t是因為可以定義不同的頁面型別,方便頁表項的建立。在include/asm-i386/pgtable.h中可以發現確實定義了一些型別用來設定頁表項。
那麼很明顯合成頁表項的方法就是 #define __mk_pte(page_nr,pgprot) __pte(page_nr要注意的是page結構體本身代表了物理頁面,它會和虛擬頁面管理產生互動。(未完)
記憶體管理 預處理與結構體
1.未初始化的全域性變數 bss段 用來存放那些沒有初始化和初始化為零的全域性變數。2.初始化過的全域性變數 data 裡面存放那些初始化為非零的全域性變數。3.常量資料 rodata段 ro代表ready only,rodata就是用來存放常量資料的。在多個程序是共享的,這樣可以提高執行空間利用率...
記憶體管理與預處理,結構體問題
1 bss段 直觀來說即存放沒有初始化或者初始化為0的全域性變數,一定是全域性變數。2 data 通俗來說 data段 和 bss 沒有太大的區別,只是前者是存放未初始化或者初始化為0的全域性變數,而後者是用來存放那些初始化不為0的全域性變數。注意 兩個都只是存放的全域性變數 3 段 直觀理解為函式...
與記憶體管理相關的幾個巨集
這幾個巨集把無符號整數轉換成對應的型別 define pte x pte t define pmd x pmd t define pgd x pgd t define pgprot x pgprot t 根據x把它轉換成對應的無符號整數 define pte val x x pte low defi...