x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42
1. 為什么會有分頁機制?
有些資料說是為了實現“虛擬內存”,真的是這樣嗎?如果沒有分頁機制,能否實現“虛擬內存”?答案是肯定的。
當同時運行的任務很多時,內存可能就不夠用。這時候操作系統就該大展身手了。每個段描述符都有A位,每當訪問一個段時,處理器都會將其置位。操作系統可以定時對A位清零,借此機會可以統計段的訪問頻率。當內存不夠用的時候,操作系統可以將訪問較少的段換出到磁盤上,以騰出空間給馬上要運行的段使用。當某個段被換出到磁盤時,操作系統應該將這個段的描述符的P位清零。過上一段時間,當再次訪問這個段時,因為它的描述符的P位是0,處理器就會引發段不存在異常(中斷號11)。這類中斷通常是由操作系統處理的,它會用同樣的方法騰出空間,然后把這個段從磁盤調入內存。當這類中斷返回時,處理器會再次執行引發異常的那條指令,這時候段已經在內存中(P=1),于是程序又可以繼續執行了。
由此可見,即使沒有分頁機制,利用“分段”也可以實現“虛擬內存”。
但是,因為段的長度不固定,在段的換入換出時會產生外部碎片,這樣就浪費了很多內存。為了解決這個問題,從80386處理器開始,引入了分頁機制。
分頁機制簡單來說,是用長度固定的頁來代替長度不定的段,以解決因段的長度不同帶來的內存空間管理變得復雜的問題。
盡管操作系統也可以利用純軟件來實施固定長度的內存分配,但是太過于復雜。由處理器固件來做這件事情,可以省去很多麻煩,速度也可以提高。
2. 從虛擬地址到物理地址
分頁機制是80x86內存管理機制的第二部分。它在分段機制的基礎上完成虛擬(邏輯)地址到物理地址轉換的過程。分段機制把邏輯地址轉換成線性地址,而分頁則把線性地址轉換成物理地址。
分頁機制會把線性地址空間(段已映射到其中)劃分成頁面,然后這些線性地址空間的頁面被映射到物理地址空間的頁面上。
80x86使用4K(2的12次方)字節固定大小的頁面。每個頁面均是4KB,且對齊于4K地址邊界處(地址的低12位全是0)。
3. 簡單的分頁模型
4GB(2的32次方)的線性地址空間可以劃分為1048576(2的20次方,即1M)個頁面。為了根據線性地址找到對應的物理地址,操作系統必須維護一張表(如下圖所示)。
這個表暫且叫做“頁映射表”,它一共有1048576個表項,每個表項占4個字節,其內容是某個頁的起始物理地址(共32比特,低12位全為0).頁映射表是這樣使用的:因為頁的尺寸是4KB,所以線性地址的低12位可以作為頁內偏移,高20位可以用來索引一個表項,找到了這個表項,就找到了對應的物理頁。
4. 頁表和頁目錄
4.1 層次化的分頁結構
上文提到的頁映射表,一共有1048576(=1M)個表項,每個表項占4個字節,所以表的大小是4MB,在當時看來要占用相當一部分內存。考慮到在實踐中,沒有哪個任務會真的用到所有表項,充其量只是很小一部分,所以內存中放一個4MB的表格確實很浪費。也許你會建議,能不能先劃出一小片內存,只存表格用到的部分,然后根據需要動態擴展。的確,這個方法可行。但是因為特殊原因(后面我們會學習到,整個映射表的前一半對應全局地址空間,后一半對應局部地址空間),這張表從一開始就必須完全定義(留夠空間),所以不可避免地要占用4MB的內存空間。為了解決這個問題,同時又不會浪費寶貴的內存空間,處理器設計了層次化的分頁結構。
4.2 頁表
4GB(2的32次方)的線性地址空間可以劃分為1048576(2的20次方,即1M,也可以看成是1024*1024)個頁面,所以,可以隨機地抽取這些頁面,每1024個頁面是一組,可以分成1024組。對于每組中1024個頁面的物理地址,按某種順序排列可以構成一張表(每個表項都是一個頁面的物理地址),這個表就是頁表。頁表的大小是1024*4B=4KB,剛好是一個物理頁的大小。
4.3 頁目錄
因為已經分成了1024組,每組都有一個頁表(大小為4KB),所以這1024個頁表又可以用一張表來指向,這就是頁目錄。類似于頁表,頁目錄共有1024個表項(稱作頁目錄項),每個頁目錄項的內容是某個頁表的物理地址。頁表的大小是1024*4B=4KB,剛好是一個物理頁的大小。
需要注意的是:
1. 這樣的層次化分頁結構是每個任務都有的,或者說每個任務都有自己的頁目錄。在處理器內部,有一個控制寄存器叫CR3,存放著當前任務的頁目錄的物理地址,故CR3又叫做頁目錄基址寄存器(Page Directory Base Register,PDBR).
2. 每個任務都有自己的TSS,其中就包括了CR3寄存器域,存放著任務自己的頁目錄的物理地址。當任務切換時,CR3寄存器的內容也會被更新,更新為新任務的頁目錄的物理地址。
3. 頁目錄和頁表也是普通的頁,混跡于全部的物理頁中。它們和普通的頁沒有什么區別,無非就是功能不一樣。當任務被操作系統撤銷后,它們和任務所占用的普通的物理頁一樣會被回收。
4. 頁目錄總是在物理內存中,頁表可以在需要時再分配,這樣就大大節省了物理內存。
5. 地址變換的具體過程
具體怎么變換,還是用書上的例子來說明吧。
假設段部件輸出的線性地址是0x00801050,如果沒有開啟分頁,那么這個地址就是物理地址;但是現在開啟了分頁,所以要經過頁部件的轉換,才能得到物理地址。
處理器的頁部件專門負責線性地址到物理地址的轉換工作。它首先將32位的線性地址分成3段,分別是高10位,中間10位和低12位。高10位用來索引頁目錄,中間10位用來索引頁表,低12位作為頁內偏移。
總結
以上是生活随笔為你收集整理的x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 劝学(集句)
- 下一篇: PHP中使用八进制 可以在前面加,PHP