虚拟地址到物理地址

虚拟地址空间就是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 虚拟地址  //得到虚拟地址对应的页表和物理地址等信息

10-10-12分页机制(xp)的更多相关文章

  1. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  2. 北京Uber优步司机奖励政策(10月12日~10月18日)

    用户组:优步北京人民优步A组(适用于10月12日-10月18日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万 ...

  3. 非寻常方式学习ApacheTomcat架构及10.0.12源码编译

    概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...

  4. 找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}

    int [][]a={{3,2,6},{6,8,2,10},{5},{12,3,23}}; //先对二维数组进行遍历:然后把二维数组合成一个数组 int[] k=new int[11]; int q= ...

  5. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  6. 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦

    认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...

  7. 2016年10月12日 星期三 --出埃及记 Exodus 18:23

    2016年10月12日 星期三 --出埃及记 Exodus 18:23 If you do this and God so commands, you will be able to stand th ...

  8. WMware 10 Ubuntu 12.04 进入Unity模式

    /********************************************************************* * WMware 10 Ubuntu 12.04 进入Un ...

  9. Java面试题:n=2\n1*2*5*6\n--3*4\n\nn=3\n1*2*3*10*11*12\n--4*5*8*9\n----6*7\n如何实现如上结构的数据

    今天学长在面试的时候遇到了一道题,然后让大家做一做. 在不看下面的答案之前,悠闲的朋友们一起来抖动一下大脑吧! 以下是我的想法: import java.util.Scanner;public cla ...

随机推荐

  1. 混合编程:如何用python11调用C++

    摘要:在实际开发过程中,免不了涉及到混合编程,比如,对于python这种脚本语言,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成. 那怎样做呢?我们能使用pybind11作 ...

  2. Linux入门视频笔记三(常用工具集)

    一.全局变量(Linux中的全局变量指在整个系统中都能用的变量) 1.USER:当前登录系统的用户的用户名 2.HOME:当前用户的主目录 cd $HOME 或 cd ~可以进入用户主目录 3.PAT ...

  3. [换根DP]luogu P3647 [APIO2014]连珠线

    题面 https://www.luogu.com.cn/problem/P3647 不重复地取树中相邻的两条边,每次得分为两条边权和,问最大得分 分析 容易想到状态 f[i][0/1] 分别表示 i ...

  4. JVM虚拟机知识问答总结(简单复习,快速回忆!)

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  5. effective解读-第八条 避免使用finalizer和Cleaner

    java9之前finalizer,java9使用cleaner代替了finalizer.相比finalizer,cleaner(它存在于一个独立类Cleaner中,需要时候注入到对应类中即可)不会污染 ...

  6. Windows10家庭版安装docker

    在公司,一直使用mac系统,在mac上安装使用docker还是比较方便的,可本人心血来朝,家里是win10 home版,就想在windows上刷一刷. 好了,废话不多说,直接上干货. 为了不误导广大爱 ...

  7. .netcore ioc 循环依赖问题及其相关思考之DispatchProxy

    .netcore引入了ioc机制让开发人员逐步习惯从过去的各种new对象变成通过IOC框架来管理对象的生命周期.这样当我们需要某个对象的时候,我们一般在构造函数里申明该对象的接口,即可通过ioc容器创 ...

  8. 2018年block3学习计划

    还是要给自己制定一个block的计划,希望自己的技术能有更进一步的提升 1. 算法/数学 随着学习的进一步深入,愈发认识到了算法的重要性,这个block给自己定下的计划就是 1)把introducti ...

  9. Android-SQLite的介绍 以及四个基本操作~

    在Android 开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的.一 ...

  10. 为什么要进行系统拆分?如何进行系统拆分?拆分后不用dubbo可以吗?

    分布式系统,我用一句话给你解释一下,实在没时间多唠了,就是原来20万行代码的系统,现在拆分成20个小系统,每个小系统1万行代码.原本代码之间直接就是基于spring调用,现在拆分开来了,20个小系统部 ...