前言:PDE_PTE属性(U/S位和PS位和A位和D位)的笔记
上一篇笔记已经学习过了R/W位和P位,一个是读写位,还有一个是有效位,这里的话继续来学习相关的U/S位和PS位和A位和D位
U/S位
U/S位是PDE和PTE都具备的属性,这个属性的含义是表示访问指定的物理页的用户是否为特权用户
U/S = 0 特权用户
U/S = 1 普通用户
练习
修改一个高2G线性地址的PDE/PTE属性,实现Ring3可读.
拆分
0x8003F00C
->
1000 0000 00 *4->800
00 0011 1111 *4->FC
00C
修改该线性地址对应的PDE和PTE的U/S位为1即可,修改如下
PDE的修改如下
PTE的修改如下
结果如下,访问发现报错
查了别人的文章,发现说可能还需要改变下G位,置为0
参考文章:https://blog.csdn.net/qq_18059143/article/details/103285462
再次进行测试,可以成功进行读取了
学习到了这里我们就可以总结两种方法在8086中访问高2G的内存了
第一种是通过门提权来进行0环,然后去读内存,其实就是通过段提高了权限来访问高2G
第二种就是今天学习的就是通过修改PDE和PTE的的U/S位的属性,然后去读内存,其实也就是降低了页的权限来访问高2G(可能有人会问,那段呢?默认数据段就是可以访问对应的RPL为3的段描述符的呀,所以段肯定是可以的!)
总结相关知识点:
1、2G以上是内核才能访问的原因是U/S位的设置问题,如果将内核的某个页设置为1 就可以在R3访问了(理解)
2、0 1 2是系统环 可以访问系统页和用户页。0环是特权级环,1、2环虽然不是特权级环,但是也是系统环,3环是用户环,可以访问用户页(没有真正的理解这个点的意思)
关于PDE和PTE的G位
意思好像就是如果置1的话,那么如果当前的PDE或者PTE被改变,但是不会导致页属性失效,还是保持原来的页属性
PS位
只对PDE有意义,PS == PageSize的意思当PS==1的时候 PDE直接指向物理页 无PTE,低22位是页内偏移。
线性地址只能拆成2段:大小为4MB,俗称"大页"
所以在看PDE的时候,先看P位,再看PS位,如果PS位不是为1,那么就正常4kb的看,如果不是那么就是大页,低22就是业内偏移
练习
分析8043F00C线性地址的PDE属性
拆分
8043F00C
->
1000 0000 01 *4 -> 0x804
00 0011 1111 *4 -> 0xFC
00C
来进行寻找对应的PDE,如下图所示,为0x004009e3
对0x004009e3进行拆分
第低2位为e -> 1110,那么ps位1,所以PDE指向的就直接是物理页了,那么偏移地址为低22位是页内偏移,也就是00 0000 1001 1110 0011 -> 0x9e3
A位
是否被访问(读或者写)过,默认为0,如果访问过则置1,即使只访问一个字节也会导致PDE/PTE的A位置1
D位
D(dirty),个人理解,所以被称呼为脏位
D脏位:是否被写过,默认为0,0没有被写过,1被写过
无效的PTE
老师讲解了当P位为0的时候,也就是PTE无效的时候的多种情形,它的过程为如下:
- 先检查P位是否有效
-
- 如果P位无效,那么就会查询中断描述表中的第E个段描述符,产生异常
-
-
- 再接着操作系统就会根据如下图中去查询PTE的情况
-
-
-
-
- 最后根据下面对应的几种处理来进行处理
-
-