郑重声明:未经本人允许,不得用于商业或非商业的转载和使用,如有需要请联系: 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(),