1. 10-10-12分页
1、物理地址
线性地址、有效地址、物理地址
如下指令:
MOV eax,dword ptr ds:[0x12345678]
其中,0x12345678 是有效地址
ds.Base + 0x12345678 是线性地址
2、物理在哪里?
每个进程都有一个CR3,(准确的说是都一个CR3的值,CR3本身是
个寄存器,一个核,只有一套寄存器)
CR3指向一个物理页,一共4096字节,如图:
3、设置分页模式
将noexecute 改成 execute
2、PDE/PTE
2、指向相同物理页
<1> PTE可以没有物理页,且只能对应一个物理页.
<2> 多个PTE也可以指向同一个物理页.
3、PDE/PTE属性
1、物理页的属性
物理页的属性 = PDE属性 & PTE属性
2、P位
线性地址0 为什么不能访问呢?
没有指定物理页,指定物理页就一定能访问吗?
先看PDE与PTE的P位 P=1 才是有效的物理页
3、R/W 位
R/W = 0 只读
R/W = 1 可读可写
实验:
定义一个只读类型的变量,再另一个线性地址指向相同的
物理页,通过修改PDE/PTE属性,实现可写。
4、U/S 位
U/S = 0 特权用户
U/S = 1 普通用户
实验:
修改一个高2G线性地址的PDE/PTE属性,实现Ring3可读.
比如:0x8003F00C
5、P/S位
只对PDE有意义,PS == PageSize的意思 当PS==1的时候 PDE直接指向
物理页 无PTE,低22位是页内偏移。
线性地址只能拆成2段:大小为4MB 俗称“大页”
举例:
分析8043F00C线性地址的PDE属性。
6、A 位
是否被访问(读或者写)过 访问过置1 即使只访问一个字节也会导致PDE PTE置1
7、D 位
脏位 是否被写过 0没有被写过 1被写过
8、关于PWT/PCD属性
PWT:Page Write Through
PWT = 1 时 写Cache的时候也要将数据写入内存中。
PCD:Page Cache Disable
PCD = 1时,禁止某个页写入缓存,直接写内存。
比如,做页表用的页,已经存储在TLB中了,可能不需要再缓存了。
3、页目录表基址
内容回顾
如果系统要保证某个线性地址是有效的,
那么必须为其填充正确的PDE与PTE,如果我们想填充PDE与PTE那么必须能够访问
PDT与PTT,那么存在2个问题:
1、一定已经有“人”为我们访问PDT与PTT挂好了PDE与PTE,我们只有找到这个线性
地址就可以了。
2、这个为我们挂好PDE与PTE的“人”是谁?
注意:
CR3中存储的是物理地址,不能在程序中直接读取的。如果想读取,也要把Cr3
的值挂到PDT和PTT中才能访问,那么怎么通过线性地址访问PDT和PTT呢?
1、拆分C0300000
结论:C0300000存储的值就是PDT
如果我们要访问第N个PDE,那么有如下公式:
0xC0300000 + N*4
4、页表基址
1、
2、有了0xC0300000和0xC0000000能做什么?
掌握了这两个地址,就掌握了一个进程所有的物理内存读写权限。
公式总结:
1、什么是PDI与PTI
10-10-12
2、访问页目录表的公式:
0xC0300000 + PDI*4
3、访问页表的公式:
0xC0000000 + PDI*4096 + PTI*4