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位的:

驱动学习---PAE--virtual address to physics address的更多相关文章

  1. BCM wifi驱动学习

    BCMwifi驱动学习 一.wifi详解1 1.代码路径:Z:\home\stonechen\svn\TD550_X\TD550\3rdparty\wifi\BCM43362\special\bcmd ...

  2. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

  3. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

  4. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  5. Linux驱动学习步骤(转载)

    1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ls ...

  6. own address as source address

    1222.762730] br0: received packet on nbif0 with own address as source address[ 1222.769697] br0: rec ...

  7. linux驱动学习(二) Makefile高级【转】

    转自:http://blog.csdn.net/ghostyu/article/details/6866863 版权声明:本文为博主原创文章,未经博主允许不得转载. 在我前一篇写的[ linux驱动学 ...

  8. 【Linux驱动学习】SD卡规范学习

    摘要: 学习SD卡的相关规范,包括定义,硬件特性,数据传输,命令系统等.不涉及代码. 文章针对Linux驱动开发而写,以助于理解SD卡驱动,不会涉及过多硬件内容. 纲要: 1. SD卡介绍 2. SD ...

  9. linux驱动学习_1

    目前项目需要,需要做linux驱动了,记录一下 学习驱动,大家一定都会写一个hello world代码,网上也有很多范例,但是记录一下遇到的问题. 1.make之后,使用insmod加载,终端没有打印 ...

随机推荐

  1. 基于Angularjs+jasmine+karma的测试驱动开发(TDD)实例

    简介(摘自baidu) 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.它要求在编写某个功能的代码之前先编写测试代码,然 ...

  2. Android SQLiteOpenHelper类的使用

    SQLiteOpenHelper类是Android平台提供的用于SQLite数据库的创建.打开以及版本管理的帮助类.一般需要继承并这个类并实现它的onCreate和onUpgrade方法,在构造方法中 ...

  3. Android UI 绘制过程浅析(五)自定义View

    前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View> ...

  4. 统计在从1到n的正整数中1出现的次数

    问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数. 例如:N= 2,写下1,2.这样只出现了1个“1”. N= 12,我们会写下1, 2, 3, 4, ...

  5. ASP.NET网站中获取当前虚拟目录的应用程序目录的方法(转)

    [原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法 ASP.NET网站中获取当前虚拟目录的应用程序目录的方法1.问题描述:有时候,某个网页控件会被不同目录下文件使用,此时如果该控件中有一 ...

  6. 初识ios自动化(一)

    Appium进行自动化测试有两个好处: 1. Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改自己的应用. 2. Appium支持Selenium WebDr ...

  7. .NET程序集的编译目标平台:X86 &AnyCPU &X64

    在我们测试平台上发布客户端组件,经常会碰到因为build的版本是x86还是anycpu而引起的application error的问题.借此,研究了一下X86,X64,AnyCPU的区别. 使用.ne ...

  8. 【练习】移动数据---解决null值

    1.创建数据文件: [oracle@host03 ~]$ vi base_data.dat ,zhangfei,zhangyide ,guanyu,guanyunchang ,liubei,liuxu ...

  9. SNMP开发c#,高薪诚聘,或者外包开发

    现在手里有一个IT资产管理方面的项目,主要会用到SNMP协议,要用这个协议进行开发,对网络上的设备进行控制, 现在高薪诚聘高手,或者项目外包合作,有意向的同学们可以联系我,时间紧迫, QQ:39011 ...

  10. 通过Fiddler修改包

    1.修改Request 命令行键入: bpu URL 优缺点:对单个URL打断点.不影响其他接口. 用途:可以修改客户端对服务器发送的请求,通过修改成不同的参数,验证服务器响应是否正确.通常用于模拟客 ...