101012

1. 10-10-12分页

1、物理地址

线性地址、有效地址、物理地址

如下指令:

MOV eax,dword ptr ds:[0x12345678]

其中,0x12345678 是有效地址

ds.Base + 0x12345678 是线性地址

2、物理在哪里?

每个进程都有一个CR3,(准确的说是都一个CR3的值,CR3本身是
个寄存器,一个核,只有一套寄存器)
CR3指向一个物理页,一共4096字节,如图:

101012_第1张图片

3、设置分页模式
101012_第2张图片
将noexecute 改成 execute

2、PDE/PTE

101012_第3张图片

2、指向相同物理页

<1> PTE可以没有物理页,且只能对应一个物理页.

<2> 多个PTE也可以指向同一个物理页.

3、PDE/PTE属性

1、物理页的属性

物理页的属性 = PDE属性 & PTE属性
101012_第4张图片

2、P位
101012_第5张图片
线性地址0 为什么不能访问呢?

没有指定物理页,指定物理页就一定能访问吗?

先看PDE与PTE的P位 P=1 才是有效的物理页

3、R/W 位
101012_第6张图片
R/W = 0 只读
R/W = 1 可读可写

实验:

定义一个只读类型的变量,再另一个线性地址指向相同的
物理页,通过修改PDE/PTE属性,实现可写。

4、U/S 位
101012_第7张图片
U/S = 0 特权用户
U/S = 1 普通用户

实验:

   修改一个高2G线性地址的PDE/PTE属性,实现Ring3可读.

比如:0x8003F00C

5、P/S位
101012_第8张图片
只对PDE有意义,PS == PageSize的意思 当PS==1的时候 PDE直接指向
物理页 无PTE,低22位是页内偏移。

线性地址只能拆成2段:大小为4MB 俗称“大页”

举例:

   分析8043F00C线性地址的PDE属性。

6、A 位
101012_第9张图片
是否被访问(读或者写)过 访问过置1 即使只访问一个字节也会导致PDE PTE置1

7、D 位
101012_第10张图片
脏位 是否被写过 0没有被写过 1被写过

8、关于PWT/PCD属性
101012_第11张图片
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

101012_第12张图片

4、页表基址

1、
101012_第13张图片

2、有了0xC0300000和0xC0000000能做什么?

掌握了这两个地址,就掌握了一个进程所有的物理内存读写权限。

公式总结:

1、什么是PDI与PTI
10-10-12
2、访问页目录表的公式:
0xC0300000 + PDI*4

3、访问页表的公式:
0xC0000000 + PDI*4096 + PTI*4

你可能感兴趣的:(DT)