PDE_PTE属性(US_PS_A_D)、页目录表基址、页表基址、2-9-9-12分页、TLB

14 篇文章 0 订阅
14 篇文章 3 订阅

PDE_PTE属性(US_PS_A_D)

US位
US位位于PDE和PTE下标位2的位置,
U/S=0 特权用户
U/S=1 普通用户
例子:修改一个高2G线性地址的PDE/PTE属性,实现Ring3可读,
比如:0x8003F00C
P/S位(大页分页)大小为4MB
PS位位于PTE的低7位。
P/S位只对PDE有意义,PS==PageSize的意思,
当PS==1的时候PDE直接指向物理页,无PTE,低22位是页内偏移。
比如:之前的10-10-12寻找物理页的方式是
10:页目录表
10:页表
12:物理页
但是当PS=1则寻找物理页的方式是:
10:页目录表
22:物理页
A位
位于PDE和PTE中的低5位。
是否被访问(读或者写)过访问置1,即使只访问一个字节也会导致PDE PTE置1。
D位
位于PDE和PTE中的低6位。
是否被写过,0没有被写过,1被写过。

页目录表基址

物理页属性

请添加图片描述

页目录表基址
C0300000线性地址拆分就是页目录表址,
存储的值时PDT,如果要访问第N个PDE
公式:0xC0300000+N*4。
可以看成CR3指向的PDT可以通过线性地址0xC0300000来找到,
CR3指向的地址+0xC0300000=CR3的地址(页目录表基址)。
C0300000线性地址拆分
1100 0000 00 (300*4=C00)
1100 0000 00 (300*4=C00)
0000 0000 0000(0不需要乘4)
指向CR3指向的页目录表基址。
实验
Failed to get VadRoot
PROCESS 896d4950  SessionId: 0  Cid: 06b8    Peb: 7ffdf000  ParentCid: 06fc
  DirBase: 1cc90000  ObjectTable: e24c9f08  HandleCount:  50.
	Image: notepad.exe
0: kd> !dd 1cc90000
#1cc90000 1cf70867 1ce60867 1d0b0867 00000000
#1cc90010 1cda3867 00000000 00000000 00000000
#1cc90020 00000000 00000000 00000000 00000000
#1cc90030 00000000 00000000 00000000 00000000
#1cc90040 00000000 00000000 00000000 00000000
#1cc90050 00000000 00000000 00000000 00000000
#1cc90060 00000000 00000000 00000000 00000000
#1cc90070 00000000 00000000 00000000 00000000
0: kd> !dd 1cc90000+C00
#1cc90c00 1cc90863 1d091863 00000000 09e36963
#1cc90c10 09e37963 09e38963 09e39963 09e3a963
#1cc90c20 09e3b963 09e3c963 09e3d963 09e3e963
#1cc90c30 09e3f963 09f40963 09e81963 09e82963
#1cc90c40 09e83963 09e84963 09e85963 09e86963
#1cc90c50 09e87963 09e88963 09e89963 09e8a963
#1cc90c60 09e8b963 09e8c963 09e8d963 09e8e963
#1cc90c70 09e8f963 09e90963 09e91963 09e92963
0: kd> !dd 1cc90000+C00
#1cc90c00 1cc90863 1d091863 00000000 09e36963
#1cc90c10 09e37963 09e38963 09e39963 09e3a963
#1cc90c20 09e3b963 09e3c963 09e3d963 09e3e963
#1cc90c30 09e3f963 09f40963 09e81963 09e82963
#1cc90c40 09e83963 09e84963 09e85963 09e86963
#1cc90c50 09e87963 09e88963 09e89963 09e8a963
#1cc90c60 09e8b963 09e8c963 09e8d963 09e8e963
#1cc90c70 09e8f963 09e90963 09e91963 09e92963
0: kd> !dd 1cc90000
#1cc90000 1cf70867 1ce60867 1d0b0867 00000000
#1cc90010 1cda3867 00000000 00000000 00000000
#1cc90020 00000000 00000000 00000000 00000000
#1cc90030 00000000 00000000 00000000 00000000
#1cc90040 00000000 00000000 00000000 00000000
#1cc90050 00000000 00000000 00000000 00000000
#1cc90060 00000000 00000000 00000000 00000000
#1cc90070 00000000 00000000 00000000 00000000

页表基址

#### 拆分C0000000/C0001000
C0000000 拆分后从CR3+拆分分页将会找到第一个PTT。
1100 0000 00 (300h*4=C00)
00 0000 0000 
0000 0000 0000
C0001000找到第二个PTT。
1100 0000 00 (300h*4=C00)
00 0000 0001 (1h*4=4)
0000 0000 0000
需要注意的是C0000000-C0001000差的正好是一个页也就是4KB。
掌握了PDT和PTT就掌控了一个进程所有的物理内存读写权限。
内核练习拆分C0000000
Failed to get VadRoot
PROCESS 896f4da0  SessionId: 0  Cid: 00cc    Peb: 7ffdb000  ParentCid: 0708
	DirBase: 1640c000  ObjectTable: e244a678  HandleCount:  50.
Image: notepad.exe
0: kd> !dd 1640c000
#1640c000 163a7867 1644c867 1639c867 00000000
#1640c010 1631a867 00000000 00000000 00000000
#1640c020 00000000 00000000 00000000 00000000
#1640c030 00000000 00000000 00000000 00000000
#1640c040 00000000 00000000 00000000 00000000
#1640c050 00000000 00000000 00000000 00000000
#1640c060 00000000 00000000 00000000 00000000
#1640c070 00000000 00000000 00000000 00000000
0: kd> !dd 1640c000+c00
#1640cc00 1640c863 1648d863 00000000 09e36963
#1640cc10 09e37963 09e38963 09e39963 09e3a963
#1640cc20 09e3b963 09e3c963 09e3d963 09e3e963
#1640cc30 09e3f963 09f40963 09e81963 09e82963
#1640cc40 09e83963 09e84963 09e85963 09e86963
#1640cc50 09e87963 09e88963 09e89963 09e8a963
#1640cc60 09e8b963 09e8c963 09e8d963 09e8e963
#1640cc70 09e8f963 09e90963 09e91963 09e92963
0: kd> !dd 1640c000+0
#1640c000 163a7867 1644c867 1639c867 00000000
#1640c010 1631a867 00000000 00000000 00000000
#1640c020 00000000 00000000 00000000 00000000
#1640c030 00000000 00000000 00000000 00000000
#1640c040 00000000 00000000 00000000 00000000
#1640c050 00000000 00000000 00000000 00000000
#1640c060 00000000 00000000 00000000 00000000
#1640c070 00000000 00000000 00000000 00000000
找到第一个PTT  163a7867 。
内核练习调试C0001000
Failed to get VadRoot
PROCESS 896f4da0  SessionId: 0  Cid: 00cc    Peb: 7ffdb000  ParentCid: 0708
	DirBase: 1640c000  ObjectTable: e244a678  HandleCount:  50.
Image: notepad.exe
0: kd> !dd 1640c000
#1640c000 163a7867 1644c867 1639c867 00000000
#1640c010 1631a867 00000000 00000000 00000000
#1640c020 00000000 00000000 00000000 00000000
#1640c030 00000000 00000000 00000000 00000000
#1640c040 00000000 00000000 00000000 00000000
#1640c050 00000000 00000000 00000000 00000000
#1640c060 00000000 00000000 00000000 00000000
#1640c070 00000000 00000000 00000000 00000000
0: kd> !dd 1640c000+c00
#1640cc00 1640c863 1648d863 00000000 09e36963
#1640cc10 09e37963 09e38963 09e39963 09e3a963
#1640cc20 09e3b963 09e3c963 09e3d963 09e3e963
#1640cc30 09e3f963 09f40963 09e81963 09e82963
#1640cc40 09e83963 09e84963 09e85963 09e86963
#1640cc50 09e87963 09e88963 09e89963 09e8a963
#1640cc60 09e8b963 09e8c963 09e8d963 09e8e963
#1640cc70 09e8f963 09e90963 09e91963 09e92963
0: kd> !dd 1640c000+4
#1640c004 1644c867 1639c867 00000000 1631a867
#1640c014 00000000 00000000 00000000 00000000
#1640c024 00000000 00000000 00000000 00000000
#1640c034 00000000 00000000 00000000 00000000
#1640c044 00000000 00000000 00000000 00000000
#1640c054 00000000 00000000 00000000 00000000
#1640c064 00000000 00000000 00000000 00000000
#1640c074 00000000 00000000 00000000 00000000
找到第二个PTT  1644c867 
公式总结:
1.什么是PDI与PTI
PDI是PDE的下标,PTI是PTT的下标。
10-10-12
2.访问页目录表的公式:
0xC0300000+PDI*4
3.访问页表的公式:
0XC0000000+PDI*4096+PTI*4

2-9-9-12分页

2-9-9-12分页模式图

请添加图片描述
请添加图片描述

2-9-9-12PDPT结构图

请添加图片描述

2-9-9-12PDE结构

请添加图片描述

2-9-9-12PTE结构

请添加图片描述

2-9-9-12分页概述
10-10-12分页下物理内存最多可达4GB,但是随着时代的发展4G已经无法满足要求,
1996年Intel设计了新的分页方式被成为2-9-9-12分页,又称为PAE(物理地址拓展)分页。
2-9-9-12分页机制
首先页的大小是4KB由微软开发人员规定,之前访问用物理内存长度为4GB是因为32位中20位
用于寻址剩下的12位是属性,因此想要扩展就必须提升PTT和PDT的大小,因此直接从32位扩展成
64位,因为之前是32位在4KB的页中可以有1024个项,当扩成64位时对应的页项必然减半,
变成512个项,2的9次方是512,所以PTI=9。
PDPTE
PDPTE总共有4个项对应的是2-9-9-12中的2属于新的表,因为2拆分最多二进制最多表示4项。
PDPTE全称:Page-Directory-Point-Table Entry 页目录指针表项,每项占8个字节。
里面的每一个指针即每一个项都指向一个PDT表。
启动2-9-9-12分页
将C:\boot.ini文件中execute改为noexecute重启。
XD标志为(AMD成为NX,即No Exection)
PDE/PTE结构
段的属性有可读/可写和可执行
页的属性有可读/可写
X保留	35-12物理地址	低12位(属性)
Intel做了硬件保护,做了一个不可执行位,XD=1时,
那么发生栈溢出也没有关系,即使EIP跳到了危险的数据区,也是不可执行的。
即NX=1或XD=1,此页无法被执行。

TLB

TLB
通过线性地址转换寻找物理地址不管是那种分页方式,
都需要进行大量读写内存,比如一个0x12345678我要读取1字节内容
可光PDT和PTT读写内存的字节就远远大于1字节,这种效率是非常低的,
因此CPU做了一个内部表,来记录这些东西也就是这个线性地址,
直接指向对应的物理页,需要注意的是第一次CPU不知道线性地址,
对应的物理地址在哪需要通过分页模式找到1次之后才能建立对应表。
这个表被称为TLB(Translation Lookaside Buffer),该表位于CPU内部
其速度与寄存器一样快,因为位于CPU内因此该表的大小一定不大,
可能存储的对应关系在几十条或几百条。
TLB 结构

请添加图片描述

LA(线性地址)|PA(物理地址)|ATTR(属性)|LRU(统计)
0x80000000       对应物理页
说明:
(1)ATTR(属性):属性是PDPE PDE PTE(2-9-9-12分页)这三个属性AND起来的,
如果是10-10-12就是PDE and PTE。
(2)LRU(统计) 因为TLB位于CPU内部所以存储数量有限,因此到TLB表存满时,
会检查LRU中那些使用频率比较低,使用较低的将会被删除。
(3)不同的CPU这个表的大小不一样,只要CR3变了,TLB立马刷新,一核一套TLB,
因为CR3指向物理页,当A进程切换为B进程的时候CR3将一定发生改变,
之前TLB对应的关系是属于A进程的而切换为B进程后线性地址对应的物理地址将完全错误,
因此CPU通过当前CR3寄存器的改变来判断当前进程发生了切换。
以32位操作系统为例,进程A和进程B的高2G线性地址映射为物理地址,
对应关系基本不变,因为高2g属于操作系统内存空间,如果CR3发生改变,
TLB刷新,重建2G以上很浪费时间,所以PDE和PTE中有个G标志为位(一般是PTE如果是大页则PDE)
,如果G位为1刷新TLB时将不会刷新PDE/PTE,G位为1有被成为全局页
TLB种类
TLB在X86体系的CPU最早应用于486CPU开始,
在X86CPU里边,一般都设有如下4组TLB:
第一组:缓存一般页表(4KB字节页面)的指令表缓存(Instruction-TLB)
第二组:缓存一般页表(4KB字节页面)的数据页缓存(Data-TLB)
第三组:缓存大页页表(2M/4M字节页面)的指令页缓存
第四组:缓存大页页表(2M/4M字节页面)的数据页表缓存
绕过CRC校验
影子行者技术:
利用TLB中缓存一般页的指令页缓存和数据页缓存,
缓存不同步绕过CRC校验
INVLPG指令
该指令可以指定删除TLB中不需要的映射关系
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚构之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值