《深入理解LINUX内存管理》学习笔记 (四)

郑重声明:未经本人允许,不得用于商业或非商业的转载和使用,如有需要请联系: 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(),
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值