• x64四级分页机制


    4级分页

    因为硬件限制64位系统只使用64位虚拟地址的低48位,48位虚拟地址被分为9-9-9-9-12,4个9分别表示PML4T,PDPT,PDT,PTT的PFN页帧编号(与物理页帧区分)

    PML4T,PDPT,PDT,PTT的每一项都是8个字节,CR3指向的是PML4T(Page Map Level 4 table)4级页映射表。CR3的35-12位为PML4T物理地址的高24位,低12位置零。

    PML4E的35-12位为PDPT页目录指针表物理地址的高24位,低12位置0。

    当PDPTE的PS位为1时表示启用1GB(2的 9+9+12=30 次方)大物理页,也就是不会有PDE和PTE了,其35-30位(PFN物理页帧)为物理地址的高6位,低30位置0,对应的页内偏移为9+9+12的值。
    当PDPTE的PS位为0时表示不启用1GB的大物理页,其35-12位为PDT的物理地址。

    当PDE的PS位为1时表示启用2MB(2的 9+12=21 次方)大物理页,也就是不会有PTE了,其35-21位(PFN物理页帧)为物理地址的高15位,低21位置0,对应的页内偏移为9+12的值。
    当PDE的PS位为0时表示不启用2MB的大物理页,其35-12位为PTT的物理地址。

    当没有启用1GB和2MB的大物理页时,PTB的35-12位为物理内存的起始地址。

    4级分页验证

    运行代码得到szName字符串的虚拟地址为:0x30F640

    char szName[0x100] = "Hello World!";
    printf("szName:%x\n", szName);
    

    对64位虚拟地址的低48位进行拆分,得到PML4T,PDPT,PDT,PTT的PFN页面帧编号,以及物理地址偏移。

    根据对应的规则找到虚拟地址对应的物理地址。

  • 相关阅读:
    五:bean
    android学习笔记1:对应用进行单元测试
    二:spring的运行原理图:
    奇偶效验码和海明码
    python3输出素数
    关于项目流程
    php操作Mysql 以及封装常用的函数 用外连接连接3个表的案例
    一些列类型还有属性
    查询五子句
    实现注册功能
  • 原文地址:https://www.cnblogs.com/revercc/p/16041279.html
Copyright © 2020-2023  润新知