内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理
內(nèi)核知識(shí)第九講,32位下的分頁(yè)管理,36位下的分頁(yè)管理.以及64位下的分頁(yè)管理
一丶熟悉WinDbg的常見命令.
dd?虛擬地址? ? ? 顯示內(nèi)存.
!dd?加上!,? ? ? ? !?dd?物理地址? ? ?專門用于顯示物理地址的.
!PTE? 虛擬地址:? ?微軟給你計(jì)算出PDE,和PTE的虛擬地址的位置.(自動(dòng)查表并且進(jìn)行操作)
例如隨便求一個(gè)虛擬地址:
DD命令的使用:
當(dāng)然,?db則是一個(gè)字節(jié)一個(gè)字節(jié)顯示,?dQ則是八個(gè)字節(jié)顯示.
!dd,?物理內(nèi)存顯示:
!PTE?查詢頁(yè)目錄表和頁(yè)表.
微軟給的是虛擬地址,我們只需要再次進(jìn)行DD?這個(gè)虛擬地址即可.
二丶尋址結(jié)構(gòu)圖
昨天我們講解的是32為下4M+4K的做表方式.? 一個(gè)頁(yè)目錄表.一個(gè)頁(yè)表 (PDE,PTE),虛擬地址當(dāng)作下表進(jìn)行尋址動(dòng)作.
然后還有一個(gè)尋址結(jié)構(gòu)圖
?
?1.?首先第一步,虛擬地址是段加偏移的方式? 例如: CS:00401000
?2.而后,段CS,當(dāng)作選擇子去GDT表中查表.找到線性地址.?因?yàn)镚DT微軟不使用.所以GDT表中的段首地址是0,所以 0 +?我們的偏移,找到線性地址.?圖中(linAddr)
?3.而后線性地址,拆分成索引.去查詢頁(yè)目錄表.?而后繼續(xù)查詢頁(yè)表.而后從頁(yè)表中取出物理地址,加上虛擬地址的偏移.則是一個(gè)完整的物理地址.
PS:?因?yàn)镚DT沒有使用,所以如果不開啟分頁(yè)保護(hù).這個(gè)線性地址就是物理地址.但是現(xiàn)在開了,所以要查詢物理地址,看下圖
0-15是段選擇子,0-31是虛擬地址.?段選擇子去GDT查表.加上我們的虛擬地址就是物理地址.?而是否開啟分頁(yè)保護(hù),就是修改CR0的標(biāo)志位.上一篇已經(jīng)講過了.
這里查表,拆分成了索引.但是昨天我們只學(xué)習(xí)了4M+4K的查表方法.虛擬地址的前20位做索引.?查詢.
但是32位下還有別的做表方式.
三丶32位下的PDE,PTE表,以及通用查表方法(通用:?指的是大同小異)
看一下32位下的做表的圖:
?
32位系統(tǒng)下,PDE有1024項(xiàng),每一項(xiàng)是4個(gè)字節(jié),其中存儲(chǔ)了頁(yè)表的位置.
這個(gè)就是我們昨天就愛了各國(guó)的.
1.首先從CR3中取出頁(yè)目錄表(PDE)
2.虛擬地址作為下表查詢PDE.
3.根據(jù)查詢的PDE表項(xiàng).找出PTE的位置.
4.根據(jù)索引.查詢PTE的位置.
5.根據(jù)PTE中的內(nèi)容.加上我們的虛擬地址的后12位,就得出了這個(gè)線性地址在物理地址的位置.
實(shí)戰(zhàn)演練:
查詢GDT虛擬地址的物理地址.
1.獲取GDT的虛擬地址,?獲取CR3的值.
VA =? 8003F00
CR3 = 39000
2.查分虛擬地址.當(dāng)作下表.查詢頁(yè)目錄表的位置.
8003f000?保留低12位 = 8003f
查分為索引.
8003f =?10000000000000111111
對(duì)2進(jìn)制分割.?分為前10位.后10位.從右往左分割.?前10位索引當(dāng)作 PDE的下表.?后10位的索引當(dāng)作PTE的下表.
1000000000? ? ? ? ? ?0000111111?
PDE =?1000000000 ,轉(zhuǎn)為16進(jìn)制 = 0x200
PTE =?0000111111? ?,轉(zhuǎn)為16進(jìn)制 = 0x3f
由此得出下表.
3.根據(jù)下表進(jìn)行查表.
CR3是PDE的首地址.?所以我們直接用WinDbg進(jìn)行查表即可.
公式:
物理地址 *?索引 *4,?為什么*4,因?yàn)镻DE的一個(gè)表項(xiàng)是4個(gè)字節(jié)
由此得出頁(yè)表的位置(PTE)
4.查詢頁(yè)表(PTE)
我們從PDE表項(xiàng)中,取出前20位,然后加上12位,繼續(xù)進(jìn)行查表.
為什么這樣做.上一篇已經(jīng)介紹了表格式了.
?
5.根據(jù)PTE的內(nèi)容.找出物理地址的位置.
根據(jù)上圖,我們已經(jīng)找到物理地址了.
取出前20位,加上虛擬地址的后12位偏移.則是物理地址了.
找出了所在的物理地址了.
此時(shí)我們dd?虛擬地址.查看是否兩塊內(nèi)存是一樣的.
?
?至此.我們的查表已經(jīng)完成.
但是.我們這樣查詢是錯(cuò)誤的.為什么?
首先查詢方法是正確的.類似于上面.我們已經(jīng)正確的查詢到了物理地址.?但為什么又說是錯(cuò)誤的.
原因:
操作系統(tǒng)在做分頁(yè)管理的時(shí)候.不一定是4M+4k的這種表來做的.?有可能有更大的表.
所以我們要看標(biāo)志位進(jìn)行查表
四丶標(biāo)志位介紹.
?
?上圖介紹了標(biāo)志位為什么.表項(xiàng)做多大的.
1.?如果PSE和PS位都為1.那么這個(gè)表就做成4MB的.
2.如果PS位為0.PSE位無效那么這個(gè)表就做成4kb的.
3.如果PAE為1,PS位為1,則表項(xiàng)做成2MB的.
?
我們要看標(biāo)志位進(jìn)行查表.
PAE位 (物理地址擴(kuò)展):?存放在CR4寄存器的第五位.
PSE位 (頁(yè)尺寸擴(kuò)展):?存放在CR4寄存器的第4位.
PS位:? 存放在PDE(頁(yè)目錄表的第7位)
上面所說的.都是從左往右的位.
比如:
CR4寄存器的值 = 0x34500
拆分:
0011 0100 0110 0000 0000? ?第4位.第五位都是0.
索引我們要根據(jù)位來看看到底是什么表.
?
五丶32位表項(xiàng).
從上面我們得知了第一種表現(xiàn).是4KB的表項(xiàng)做法.每一個(gè)都是1024項(xiàng)的.
4kb表項(xiàng)
?
也就是我們上圖做的.查表的是否根據(jù)上圖去查表的.
4MB的頁(yè)
這個(gè)就很簡(jiǎn)單了.發(fā)現(xiàn)了沒有.上面少了一個(gè)頁(yè)表.?我們從PDE中查表的時(shí)候.查出來直接就是物理地址了.
而且虛擬地址的偏移是22位了.所以最后我們加的是前10位.
而且下圖也有說.
還把各種標(biāo)志位的作用都說了.
查表方法同上面一樣.?只不過最后加偏移的是否是?從PDE表中的所在物理地址的位置取出10位.然后加上我們的偏移即可.
例如我們從上面隨便找個(gè)PDE的表
假設(shè) PDE中的0003b163是物理地址.我們只需要取出前10位.然后加上我們的偏移即可.
0000 0000 00 + offset =?物理地址.
?
六丶開啟PAE,36位表項(xiàng).
在我們可以映射4G內(nèi)存的是否.?內(nèi)存發(fā)展速度大于CPU.此時(shí)已經(jīng)8G內(nèi)存了.如果訪問
此時(shí)CPU廠家.就加了4根地址總線.以支持8G的訪問.
而因?yàn)闉榱酥С?所以表項(xiàng)變成了512個(gè)項(xiàng)了.?每一項(xiàng)8個(gè)字節(jié)了.
36位下4KB的分頁(yè)
根據(jù)上圖,我們可以看出.加了一個(gè)新表.
我們的虛擬地址索引的高2位要做為這個(gè)?新表的索引去查詢.?
最后我們的12位偏移,要加上PTE中物理地址的24位才是我們的物理內(nèi)存的位置.
而這種做表方法.只能說也是映射4G內(nèi)存.只不過可以映射多個(gè)4G內(nèi)存了.
查表方法和上面一樣.
首先字節(jié)改變了.?每一項(xiàng)8個(gè)字節(jié),而后最后我們是12位加上24位.得出物理地址.
?
?36位下2MB的分頁(yè)
?
?
?
?也是同上.只不過少了一個(gè)PTE.查表動(dòng)作少了一次而已.
.只不過計(jì)算的是否.要根據(jù)36位地址來計(jì)算.
看下圖.
?
?2MB的
?
?第一張圖,告訴了我們.我們進(jìn)行查表的時(shí)候. 4KB的怎么加.
例如:
我們以前查表是? !dd 3f000000 ,正好32位.而看上圖.4KB的告訴了我們.
32位 - 35位當(dāng)作基址查詢.(4位)?要加上.?比如 !dd 00003f000000?正好滿足36的地址進(jìn)行查尋.
2MB的圖是一樣的.
?
七丶64位系統(tǒng)下的表項(xiàng)
64位CPU下的的表項(xiàng).同32為系統(tǒng)的表項(xiàng)是一樣的.?只不過變的更大了.
4kb的表項(xiàng)
和32位下一樣.加了幾張表.各種位都變大了.
2MB的分頁(yè)
?
?
?64位擴(kuò)展的2MB分頁(yè)
64位下映射1GB的圖
CR3.?當(dāng)我們3環(huán)調(diào)用0環(huán)回調(diào)的是否.CR3是ring3的.
?
八丶為什么學(xué)習(xí)這些表.以及學(xué)這些表的作用
為什么學(xué)習(xí).?因?yàn)榈搅?環(huán).就是對(duì)抗了.?就比誰對(duì)操作系統(tǒng)了解.
比如我們熟悉上面的這些表的設(shè)計(jì).?而且根據(jù)GDT,找出線性地址.根據(jù)線性地址找出對(duì)應(yīng)的物理地址.
那么我們完全可以進(jìn)行手動(dòng)操作物理內(nèi)存.?實(shí)現(xiàn)ReadProcessMemory和WriteProcessMemeory.
當(dāng)然不會(huì)怎么簡(jiǎn)單.但是我們能操作內(nèi)存了.?是不是就不用調(diào)用API了.我們自己實(shí)現(xiàn)了?內(nèi)存讀寫功能.
舉例子:
假設(shè)游戲有保護(hù).保護(hù)了API.?不讓你讀寫內(nèi)存.?給你HOOK了.各種檢測(cè).?但是我們不調(diào)用.?我們自己寫一個(gè).它怎么檢測(cè).
?
轉(zhuǎn)載于:https://www.cnblogs.com/iBinary/p/8315085.html
總結(jié)
以上是生活随笔為你收集整理的内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime text 3设置快捷键让
- 下一篇: Python 之 风格规范(Google