虚拟地址到物理地址

虚拟地址空间就是32位系统的那4GB,这4GB空间的地址称为虚拟地址。虚拟地址经过分段机制后转化为线性地址,一般虚拟地址都等于线性地址,因为大多数段寄存器的基地址都为0,只有FS段寄存器的基地址不会0。线性地址经过分页机制最终映射到物理地址上。

页目录表,页表

页目录表实际是特殊的页表,普通的页表的页表项都指向物理页,而页目录表的页目录项指向的是其他页表。

CR3寄存器中前20位存储的是页目录表的物理基地址,每个进程的CR3都不同,也就是每一个进程都有自己的一套页表。

页目录表项PDE前20位存取的是页表的物理基地址,而后12位为属性。其P/S位如果为1表示物理页大小为2的22次方(10 + 12) = 4MB(大页)也就没有页表了,如果为0表示物理页大小为4kB。

页目录表项PDE的第0位为有效位,第1位为R/W读写位(0只读,1可读可写),U/S位为权限位(0特权用户可以访问,1普通用户可以访问):例如一些高2Gb地址空间的地址在用户层不能访问就是因为此地址空间中地址对应的U/S位为0。A位为访问位表示是否被访问过,D位为写位表示是否被写过。当ps位为1时表示G位有效,其G位为1时表示此线性地址为全局页,即当CR3改变(进程切换时),CPU中存储的TLB表对应的此地址的项并不会刷新。

以上这些属性页表项也有,而且对应物理地址的最终属性为PDE的属性与上PTE的属性。

注意:当PDE的PS位为0时无论是页表目录还是页表,其都是物理页,且页面大小都是4KB

10-10-12分页

10-10-12分页的意思是将32位线性地址拆分成10位-10位-12位。

第一个10位为页目录表的索引,第二个10位为页表的索引,第三个12位为物理页中的偏移地址。这是对物理页为4kb的而言,也就是说页目录表项的PDE的PS位为0。当ps位为1 时表示使用的是4MB的物理内存页,那么线性地址的第2个10位和第三个12位组成物理地址的低22位,其他28位在页目录项PDE中存储。

页目录表基地址,页表基地址

页目录表的线性基地址为0xC0300000,而页表的线性基地址为0xC0000000。因为页目录表就是页表而且其表大小都是2的10次方(0x1000个字节),所以页目录表实际是第0x300个页表。0xC0300000线性基地址指向的物理地址就是CR3指向的物理地址。

//PDI为线性地址的第一个10位,PTI为线性地址的第二个10位
0xC0300000 + PDI * 4 //访问页目录表 0xC0000000 + PDI * 4096 + PTI * 4 //访问页表

读写0地址

如果直接读写0地址会出错,我们可以查看一下线性地址0x00000000对应的物理地址。CR3为0x16f5a000,查看其PTE为0说明并没有为0地址挂物理页所以不能读写此地址。



我们要想读写0地址就要为其挂上物理页,我们可以利用VirtualAlloc申请虚拟内存,然后将此虚拟内存对应的物理页挂到0地址处。假设VirtualAlloc申请的虚拟内存地址为0x003F0000,我们查看其PDE与PTE。

0线性地址的PDE与0x003f0000地址的PDE相等,我们将0x003f0000的PTE写到0地址的PTE地址处,这样就为其挂上了物理页。

这时我们在读写0地址都不会出错,因为其已经分配了物理页。我们还可以在应用程序中提权后,根据页目录表基地址0xC0300000和页表基地址0xC0000000找到任意虚拟地址的PDE和PTE从而控制他们的属性。

!vtop cr3 虚拟地址  //得到虚拟地址对应的页表和物理地址等信息

最新文章

  1. Spark 学习总结
  2. android 网络请求库的比较
  3. 关于js的keycode13
  4. this的面面观
  5. 仿StackOverflow开发在线问答系统
  6. Hadoop概论
  7. shell总的exit与sleep
  8. sh 脚本执行sql文件传参数
  9. SQL Server进阶(十二)函数
  10. 在CI框架中如何实现伪静态
  11. sql 把一个用逗号分隔的多个数据字符串变成一个表的一列
  12. 蛋白质结构模型和功能预测:I-TASSER工具的使用
  13. VMware 获取该虚拟机的所有权失败
  14. Android 充电信息的获取【转】
  15. AMR文件结构
  16. 输入操作遇到unknown error: cannot focus element
  17. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心
  18. Django-MySQL数据库使用01
  19. npm是干什么的?
  20. 一个辅助AWVS C段扫描的小php脚本

热门文章

  1. F - Fluctuation Limit HDU - 6860
  2. 【.NET 与树莓派】小风扇模块
  3. Androidd Studio 之多行文字跑马灯特效
  4. 计划任务统一集中管理系统cronsun(替代crontab)
  5. react项目运行安装依赖报错:Error: pngquant failed to build, make sure that libpng-dev is installed
  6. [Fundamental of Power Electronics]-PART I-6.变换器电路-6.3 变压器隔离
  7. buuctf pwn wp---part1
  8. Horovod in Docker
  9. (十一)Docker-DinD
  10. Day08_40_集合_List