101012
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
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
總結
- 上一篇: VMware Workstation 无
- 下一篇: js拖动元素方法