日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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位作為頁內偏移。

  • 當前任務的頁目錄的物理地址在CR3寄存器中,假設是0x00005000;
  • 段部件輸出的線性地址是0x00801050,按照高10位,中間10位和低12位分為三段,分別是0x002,0x001,0x050;
  • 0x002乘以4(因為每個表項占4個字節)得到0x008,作為偏移訪問頁目錄,得到了0x08001000,這就是頁表的物理地址。
  • 0x001乘以4(因為每個表項占4個字節)得到0x004,作為偏移訪問頁表,得到了0x0000c000,這就是我們要找的那個物理頁的起始地址。
  • 0x050作為頁內偏移,和物理頁的起始地址0x0000c000相加,得到0x0000c050,這就是最終的物理地址。
  • 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。