开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44
開啟分頁機制
必須說明的是,必須在保護模式下才能啟動分頁功能。本章的引導程序依然用第13章的。
開啟分頁機制之前,必須創建頁目錄和頁表。因為內核是在開啟頁功能之前加載的,段在內存中的位置已經固定。在這種情況下,即使開啟了分頁功能,線性地址也必須和物理地址相同才行,不然就會“跑飛”。
因為我們的內核很小,將其加載到內存后,連低端的1MB空間都沒有占完全,所以只需要將低端1MB內存做特殊處理,使這部分內存的線性地址和物理地址相同即可。這樣做的好處是:內核不用做任何變動即可在分頁模式下繼續正常工作,再也不會擔心“跑飛”了。
對于頁目錄和頁表,頁目錄必須在內存中,頁目錄和頁表必須各自占用一個自然頁,也就是說它們的物理地址的低12位必須全零。
一個頁表最多可以容納1024個表項,對應1024個頁,也就是4MB內存。對于我們的內核,還不到1MB,所以一個頁目錄和一個頁表足矣。作者的設計是把頁目錄放在物理地址0x0002_0000處,把頁表放在0x0002_1000處。
926 ;頁目錄表清零 927 mov ecx,1024 ;1024個目錄項 928 mov ebx,0x00020000 ;頁目錄的物理地址 929 xor esi,esi 930 .b1: 931 mov dword [es:ebx+esi],0x00000000 ;頁目錄表項清零 932 add esi,4 933 loop .b1以上代碼將頁目錄和頁表的所有目錄項清零。之所以這樣做,主要是使所有目錄項的P位為0.
935 ;在頁目錄內創建指向頁目錄自己的目錄項 936 mov dword [es:ebx+4092],0x00020003 937 938 ;在頁目錄內創建與線性地址0x00000000對應的目錄項 939 mov dword [es:ebx+0],0x00021003 ;寫入目錄項(頁表的物理地址和屬性)創建2個目錄項。
936:P=1;RW=1;US=0;這個目錄項指向了自己,為的是可以方便地用線性地址訪問自己。
939:添加一個表項,使其指向頁表。P=1;RW=1;US=0。
上面的代碼用來填寫頁表項。填寫后,內核的頁目錄和頁表視圖如下。
960 ;令CR3寄存器指向頁目錄,并正式開啟頁功能 961 mov eax,0x00020000 ;PCD=PWT=0 962 mov cr3,eax 963 964 mov eax,cr0 965 or eax,0x80000000 966 mov cr0,eax ;開啟分頁機制961~962:PWT=0,PCD=0;登記頁目錄表的基地址。
964~966:正式開啟分頁機制。
分頁機制開啟后,根據上面的頁目錄和頁表視圖,可以算出:
線性地址:0x0000_0000~0x0000_FFFF
映射到
物理地址:0x0000_0000~0x0000_FFFF;
線性地址:0x8000_0000~0x8000_FFFF
也映射到
物理地址:0x0000_0000~0x0000_FFFF;
總結
以上是生活随笔為你收集整理的开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页目录项和页表项——《x86汇编语言:从
- 下一篇: unity双击打不开脚本_游戏对象和脚本