鄭重聲明:未經本人允許,不得用於商業或非商業的轉載和使用,如有需要請聯絡: yrj1978@hotmail.com
頁表條目的操作
X86體繫結構的情況下,在include/asm-x86/pgtable.h檔案中,定義了“析出”或者“檢查”頁表條目中的值的幾個宏(在2.6.24版本的核心中,由於體繫結構的關係,這幾個宏可能分布在幾個相關的標頭檔中)。
通過 4 個宏,把一個線性地址從第一級頁目錄表 (Page directories) 追巡最後一級頁目錄表。
pgd_offset: 通過線性地址 ( 其中的一部分指出了需要訪問的記憶體位址在的 PGD 中的索引 ) 和進程的 mm_struct 資料結構對象,返回一個指向 PGD 條目的地址,內容是某個 PUD 頁面的首地址。
pud_offset: 通過線性地址(也是索引)和指向 PGD 條目的地址,返回一個指向 PUD 條目的地址,內容是某個 PMD 頁面的首地址。如果硬體系統並不支援 PUD , 則直接返回指向 PGD 條目的地址。也就是通過巧妙的直接返回 PGD 的方式,使得不同體繫結構下,統一的軟體架構。
pmd_offset: 通過線性地址(也是索引)和指向 PUD 條目的地址,返回一個指向 PMD 條目的地址,內容是某個 PTE 頁面的首地址。如果硬體系統並不支援 PMD , 則直接返回指向 PUD 條目的地址。也就是通過巧妙的直接返回 PUD 的方式,使得不同體繫結構下,統一的軟體架構。
pte_offset: 通過線性地址(也是索引)和指向 PMD 條目的地址(內容是 PMD 頁面的首地址),返回一個指向 PTE 條目的地址,內容是某個需要訪問的資料記憶體頁面的首地址(物理地址),這個地址和線性地址的低位部分的資料在記憶體頁面中的位移相加,就獲得了資料真正所在的物理地址了。
第二組宏,用於檢測頁表條目是否存在或者是否可用的資訊。 pte_none(), pmd_none(), pud_none(),pgd_none() ,如果對應的條目不存在,則返回 1 。宏的定義只是檢測條目的內容是否全 0. pte_present(), pmd_present(), pud_present(),pgd_present(), 如果條目中的 PRESENT 位被設定,則返回 1. pte_clear(), pmd_clear(), pud_clean(),pgd_clear(), 對相應條目清零。 pmd_bad(), pud_bad(),pgd_bad(),