zoukankan      html  css  js  c++  java
  • 驱动学习---PAE--virtual address to physics address

    PAE是Physical Address Extension的缩写,即物理地址扩展。简单来说,就是把IA-32处理器的寻址能力从原来的4GB扩展到64GB。寻址4GB空间,要求物理地址的宽度为32位。类似的,要寻址64GB空间,那么物理地址的宽度就是36位。因为这个原因,PAE又被称为PAE-36bit。

    一般电脑都可以轻松看出是不是使用了PAE,最简单是看系统属性:


    如果不启用PAE机制,每个进程的DirBase 的低12位应该是0,启用PAE机制低5位是0。在lkd模式下,!pte显示是不正确的

    以下是PAE启用的显示:


    以下为示例:

    代码:

    char *g_test = "123456789";
    
    int main()
    {
    	printf(g_test);

    1.找到g_test的地址

    00498004 test!g_test = 0x00486c6c "123456789"

    2.启用内核调试,观察test进程:


    上面标红的即为CR3的值,即PDPTR的内容

    我们再查看下虚拟地址分解:


    ==》

    最高两位是页目录表指针表的索引(00)

    接下来9位是页目录索引即2

    接下来9位为页表索引即0x86

    最后12位是页内偏移为0Xc6c

    可以这样理解,三张表:

    页目录指针表-->页目录表基地址

    页目录表-->页表基地址

    页表+页内偏移即为物理地址

    3.首先通过02b40320观察指针表,因为是物理地址,所以用!dq

    kd> !dq 02b40320  
    # 2b40320 00000000`0313a801 00000000`1fdfb801
    # 2b40330 00000000`1fc3c801 00000000`03579801
    # 2b40340 00000000`10c5e801 00000000`10bdf801
    # 2b40350 00000000`10ce0801 00000000`10d5d801
    # 2b40360 00000000`111bb801 00000000`1123c801
    # 2b40370 00000000`1143d801 00000000`1137a801
    # 2b40380 00000000`115dd801 00000000`1151e801
    # 2b40390 00000000`1145f801 00000000`1165c801

    每个指针对共有4个表项,每个表项是8字节(64位),上面2分析为0号表项,即00000000`0313a801

    4.把00000000`0313a801砍去低12位,高32位,就是页目录表的基地址为0313a000,观察它的第2项:

    kd> !dq 313a000+8*2
    # 313a010 00000000`03425867 00000000`00000000
    5.把00000000`03425867砍去低12位,高32位,就是页表基地址为:03425000,观察它的0x86项:

    kd> !dq 03425000+0x86*8
    # 3425430 00000000`03f80025 00000000`03301025
    # 3425440 00000000`00000000 00000000`00000000
    # 3425450 00000000`1fc2e025 00000000`00000000
    # 3425460 00000000`00000000 00000000`00000000
    # 3425470 00000000`00000000 00000000`00000000
    # 3425480 00000000`031b7025 00000000`00000000
    # 3425490 00000000`00000000 00000000`00000000
    # 34254a0 00000000`00000000 00000000`0362c025
    

    6.把00000000`03f80025砍去低12位,高32位,即内存页基地址为03f8000,加上页内偏移c6c:


    下面再发张全图加深下理解:

    注意PAE是扩展,所以都是64位的:

















  • 相关阅读:
    Ubuntu vsftp复制文件到远端时错误,Permission denied
    linux 常用命令
    vbox安装ubuntu之后挂载共享文件夹无权限访问的问题以及改了主机名,导致命令行不能解析主机名的问题
    java 中的valueOf方法和强转
    读写文件,用代码在讲html文件转为jsp文件
    hibernate查询之后用el表达式取值时遇到的问题
    考研:操作系统:进程同步—信号量实现同步互斥(PV操作)
    考研:操作系统:处理机调度——几种经典的调度算法
    KMP算法
    mysql出现ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 错误
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693346.html
Copyright © 2011-2022 走看看