10-10-12分页机制(xp)
虚拟地址到物理地址
虚拟地址空间就是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)的更多相关文章
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...
- 北京Uber优步司机奖励政策(10月12日~10月18日)
用户组:优步北京人民优步A组(适用于10月12日-10月18日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万 ...
- 非寻常方式学习ApacheTomcat架构及10.0.12源码编译
概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...
- 找出如下数组中最大的元素和最小的元素, 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= ...
- 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...
- 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦
认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...
- 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 ...
- WMware 10 Ubuntu 12.04 进入Unity模式
/********************************************************************* * WMware 10 Ubuntu 12.04 进入Un ...
- 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 ...
随机推荐
- 写了一个 gorm 乐观锁插件
前言 最近在用 Go 写业务的时碰到了并发更新数据的场景,由于该业务并发度不高,只是为了防止出现并发时数据异常. 所以自然就想到了乐观锁的解决方案. 实现 乐观锁的实现比较简单,相信大部分有数据库使用 ...
- PTA 单链表分段逆转
6-9 单链表分段逆转 (25 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1 ...
- 认清 React 的useState逻辑
useState运行过程解析 function App() { const [n, setN] = useState(0); //使用 myUseState() return ( <div> ...
- Python基础之数据类型详解
为什么会有数据类型? 在介绍具体的数据类型之前,需要了解为什么需要区分数据类型.我们知道,一个公司会有很多个大的部门,每个部门下又会有许多细分的小部门,构成了公司的完整体系结构.如果把python的数 ...
- 我叫小M,立志建立MySQL帝国。
我是小M,我在卡拉巴拉星球. 我喜欢数据,我立志成为一个数据管理者. 所以我来 Y 公司应聘,听说他们的数据量挺大的. 面试过程还是挺简单的. 我用 007 这三个数字就轻易打败了一堆吹嘘 996 的 ...
- DAOS 分布式异步对象存储|安全模型
DAOS 使用了一个灵活的安全模型,将身份验证和授权分离开来.它的设计令其对 I/O 的影响被降到最小. DAOS 对用于 I/O 传输的网络结构没有提供任何传输安全性保障.在部署 DAOS 时,管理 ...
- Spring Cloud Alibaba(2)---Nacos概述
Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- 强大的 Guava 工具类
Java 开发的同学应该都使用或者听说过 Google 提供的 Guava 工具包.日常使用最多的肯定是集合相关的工具类,还有 Guava cache,除了这些之外 Guava 还提供了很多有用的功能 ...
- IDEA 配置文件位置
1 IDEA 2020.1 以上 1.1 Win 语法: %APPDATA%\JetBrains\<product><version> Win上的APPDATA默认位置如下: ...
- Java8 Map computeIfAbsent方法说明
// 方法定义 default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { . ...