虛擬地址與物理地址怎麼映射

每個進程都是獨立的虛擬地址空間,兩個獨立進程的相同地址互不干擾,但是在物理上對每個進程可能也就分了一部分空間給了某個進程,所以中間就要用到映射,那麼虛擬地址與物理地址怎麼映射呢?今天學習啦小編與大家分享下虛擬地址與物理地址映射的具體操作步驟,有需要的朋友不妨瞭解下。

  虛擬地址與物理地址映射過程

  這裏只談分頁管理的機制,也是目前最重要的內存管理機制。

  最初的設計想法:

  結構圖如下:

 

  頁的尺寸是4KB,虛擬地址的前20位用於指定一個物理頁,後12位用於訪問頁內偏移。

  頁表項的結構:

 

  各個位的含義:

  P--位0是存在(Present)標誌,用於指明表項對地址轉換是否有效。P=1表示有效;P=0表示無效。在頁轉換過程中,如果說涉及的頁目錄或頁表的表項無效,則會導致一個異常。如果P=0,那麼除表示表項無效外,其餘位可供程序自由使用,如圖4-18b所示。例如,操作系統可以使用這些位來保存已存儲在磁盤上的頁面的序號。

  R/W--位1是讀/寫(Read/Write)標誌。如果等於1,表示頁面可以被讀、寫或執行。如果爲0,表示頁面只讀或可執行。當處理器運行在超級用戶特權級(級別0、1或2)時,則R/W位不起作用。頁目錄項中的R/W位對其所映射的所有頁面起作用。

  U/S--位2是用戶/超級用戶(User/Supervisor)標誌。如果爲1,那麼運行在任何特權級上的程序都可以訪問該頁面。如果爲0,那麼頁面只能被運行在超級用戶特權級(0、1或2)上的程序訪問。頁目錄項中的U/S位對其所映射的所有頁面起作用。

  A--位5是已訪問(Accessed)標誌。當處理器訪問頁表項映射的頁面時,頁表表項的這個標誌就會被置爲1。當處理器訪問頁目錄表項映射的任何頁面時,頁目錄表項的這個標誌就會被置爲1。處理器只負責設置該標誌,操作系統可通過定期地復位該標誌來統計頁面的使用情況。

  D--位6是頁面已被修改(Dirty)標誌。當處理器對一個頁面執行寫操作時,就會設置對應頁表表項的D標誌。處理器並不會修改頁目錄項中的D標誌。

  AVL--該字段保留專供程序使用。處理器不會修改這幾位,以後的升級處理器也不會。

  由於頁表佔用內存空間太大(1M個元素*4B大小=4MB,也可以這麼看:每個進程的虛擬地址空間=4G,頁面大小=4K,所以共有1M個頁,需要1M個頁表項,又因爲每個頁表項=4B,所以頁表大小=4M),爲了減少內存佔用量,因此設計了層次化的分頁結構:頁目錄表+頁表。

  層次化的設計想法:

  因爲4GB的虛擬內存共有1M=220=1048576個4K大小的頁面。

  我們將這些頁面分成210=1024份,即從頁表1到頁表1024,由頁目錄表管理;

  每一份(每一頁表)有210=1024個頁,由每一個頁表管理,頁在頁表中是隨機的,哪個頁位於哪個頁表中是沒有規律的;

  結構圖如下:

 

  每個任務都有這樣的層次化的分頁結構,即每個任務都有自己的頁目錄表和頁表。

  從硬件角度來分析:

  在處理器中有個控制寄存器CR3,存放着當前任務頁目錄的物理地址,故又叫做頁目錄基址寄存器(Page Directory Base Register,PDBR),每個任務都存放了自己的頁目錄物理地址,當任務切換時,處理器切換到新任務開始執行,更新CR3寄存器的內容,以指向新任務的頁目錄位置;

  相應的,頁目錄又指向了一個個的頁表,每個頁表又根據任務的頁表項指向了相應的頁。其中注意的是,頁目錄和頁表也是普通的頁,混跡於全部的物理頁中,它們和普通頁的不同之處僅僅在於功能不一樣,當任務撤銷之後, 它們和任務所佔用的普通頁一樣會被回收, 並分配給其他任務(如下圖所示)。

 

  下面內容轉自《分頁機制》,寫的很清楚。

  地址變換的具體過程

  對於Intel處理器來說, 有關分頁, 最簡單和最基本的機制就是這些; CR3寄存器給出了頁目錄的物理地址; 頁目錄給出了所有頁表的物理地址, 而每個頁表給出了它所包含的頁的物理地址. 好了, 該清楚的都清楚了, 唯一還不明白的, 應該是如何用這種層次性的分頁結構把線性地址轉換成物理地址? 這裏舉個例子, 某任務加載後, 在4GB虛擬地址空間創建了一個段, 起始地址爲0x00800000, 段界限爲0x5000, 字節粒度. 當前任務執行時, 段寄存器DS指向該段. 又假設執行了下面一條指令

  mov edx, [0x1050]

  此時, 段部件會輸出線性地址0x00801050. 在沒有開啓分頁機制時, 這就是要訪問的物理地址. 但現在開啓了分頁機制, 所以這是一個下虛擬地址, 要經過頁部件轉換, 才能得到物理地址.

  如下圖所示, 處理器的頁部件專門負責線性地址到物理地址的轉換工作. 它首先將段部件送來的32位線性地址分爲3段, 分別是高10位, 中間10位, 低12位. 高10位是頁目錄的索引, 中間10位是頁表的索引, 低12位則作爲頁內偏移量來用.

 

  當前任務頁目錄的物理地址在處理器的CR3寄存器中, 假設它的內容爲0x00005000. 段管理部件輸出的線性地址是0x00801050, 其二進制的形式如圖中給出. 高10位是十六進制的0x002, 它是頁目錄表內的索引,處理器將它乘以4(因爲每個目錄項4字節), 作爲偏移量訪問頁目錄. 最終處理器從物理地址00005008處取得頁表的物理地址0x08001000.

  線性地址的中間10位爲0x001, 處理器用它作爲頁表索引取得頁的物理地址. 將該值乘以4, 作爲偏移量訪問頁表. 最終, 處理器又從物理地址08001004處取得頁的物理地址, 這就是我們一直努力尋找的那個頁.

  頁的物理地址是0x0000c000, 而線性地址的低12位是數據所在的頁內偏移量. 故處理器將它們相加, 得到物理地址0x0000C050, 這就是線性地址0x00801050所對應的物理地址, 要訪問的數據就在這裏.

  注意, 這種變換不是無緣無故的, 而是事先安排好的. 當任務加載時, 操作系統先創建虛擬的段, 並根據段地址的高20位決定它要用到哪些頁目錄項和頁表項. 然後, 尋找空閒的頁, 將原本應該寫入段中的數據寫到一個或者多個頁中, 並將頁的物理地址填寫到相對應的頁表項中. 只有這樣做了, 當程序運行的時候, 才能以相反的順序進行地址變換, 並找到正確的數據.

  頁目錄項, 頁表項, CR3和打開分頁

  頁目錄項和頁表項

  頁目錄和頁表中分別存放爲頁目錄項和頁表項, 它們的格式如下:

 

  可以看出, 在頁目錄和頁表中, 只保存了頁表或者頁物理地址的高20位. 原因很簡單, 頁表或者頁的物理地址, 都要求必須是4KB對齊的, 以便於放在一個頁內, 故其低12位全是0. 在這種情況下, 可以只關心其高20位, 低12位安排其他用途.

  P 是存在位, 爲1時, 表示頁表或者頁位於內存中. 否則, 表示頁表或者頁不在內存中, 必須先予以創建, 或者從磁盤調入內存後方可使用.

  RW 是讀/寫位. 爲0時表示這樣的頁只能讀取, 爲1時可讀可寫

  US 是用戶/管理位. 爲1時, 允許所有特權級別的程序訪問; 爲0時, 只允許特權級別爲0, 1和2的程序訪問.

  PWT(Page-level Write-Through) 是頁級通寫位, 和高速緩存有關. "通寫"是處理器高速緩存的一種工作方式, 這一位用來間接決定是否採用此種方式來改善頁面的訪問效率.

  PCD(Page-level Cache Disable)是頁級高速緩存禁止位, 用來間接決定該表項所指向的那個頁是否使用高速緩存策略.

  A 是訪問位. 該位由處理器固件設置, 用來指示此表項所指向的頁是否被訪問過.

  D(Dirty) 是髒位. 該位由處理器固件設置, 用來指示此表項所指向的頁是否寫過數據

  PAT(Page Attribute Table) 頁屬性表支持位. 此位涉及更復雜的分頁系統, 和頁高速緩存有關, 可以不予理會, 在普通的4KB分頁機制中, 處理器建議將其置0.

  G 是全局位. 用來指示該表項所指向的頁是否爲全局性質的. 如果頁是全局的, 那麼, 它將在高速緩存中一直保存(也就意味着地址轉換速度會很快). 因爲頁高速緩存容量有限, 只能存放頻繁使用的那些表項. 而且, 當因任務切換等原因改變CR3寄存器的內容時, 整個頁高速緩存的內容都會被刷新.

  AVL位卑處理器忽略, 軟件可以使用.

  CR3(PDBR)和開分頁機制

 

  控制寄存器CR3, 也就是頁目錄表基地址寄存器PDBR, 該寄存器如上圖所示.

  由於頁目錄表必須位於一個自然頁內(4KB對齊), 故其物理地址的低12位是全0. 低12位除了PCD和PWT外, 都沒有使用. 這兩位用於控制頁目錄的高速緩存特性, 參見上面解釋.

 

  控制寄存器CR0的最高位PG位, 用於開啓分頁或者關閉頁功能. 當該位清0時, 頁功能關閉, 從段部件來的線性地址就是物理地址. 當它置位時, 頁功能開啓. 只能在保護模式下才能開啓分頁功能, 當PE位清0時(實模式), 設置PG位將導致處理器產生一個異常中斷.

  不存在的頁表:

  使用二級表結構,並沒有解決需要使用4MB內存來存放頁表的問題。實際上,我們把問題搞得有些複雜了。因爲我們需要另增一個頁面來存放目錄表。然而,二級表結構允許頁表被分散在內存各個頁面中,而不需要保存在連續的4MB內存塊中。另外,並不需要爲不存在的或線性地址空間未使用部分分配二級頁表。雖然目錄表頁面必須總是存在於物理內存中,但是二級頁表可以在需要時再分配。這使得頁表結構的大小對應於實際使用的線性地址空間大小。

  頁目錄表中每個表項也有一個存在(present)屬性,類似於頁表中的表項。頁目錄表項中的存在屬性指明對應的二級頁表是否存在。如果目錄表項指明對應的二級頁表存在,那麼通過訪問二級表,表查找過程第2步將同如上描述繼續下去。如果存在位表明對應的二級表不存在,那麼處理器就會產生一個異常來通知操作系統。頁目錄表項中的存在屬性使得操作系統可以根據實際使用的線性地址範圍來分配二級頁表頁面。

  目錄表項中的存在位還可以用於在虛擬內存中存放二級頁表。這意味着在任何時候只有部分二級頁表需要存放在物理內存中,而其餘的可保存在磁盤上。處於物理內存中頁表對應的頁目錄項將被標註爲存在,以表明可用它們進行分頁轉換。處於磁盤上的頁表對應的頁目錄項將被標註爲不存在。由於二級頁表不存在而引發的異常會通知操作系統把缺少的頁表從磁盤上加載進物理內存。把頁表存儲在虛擬內存中減少了保存分頁轉換表所需要的物理內存量。

  總結:給定虛擬地址,怎麼找到它對應的物理地址?分兩步!

  第一步從虛擬地址到線性地址,第二步從線性地址從物理地址。

  第一步從段描述符表描述的段基址加上段偏移生成線性地址。

  IA32中線性地址高10位爲頁目錄索引,通過此找到頁表,線性地址中間10位爲頁表項索引,通過前面找到的頁表加上這個索引,找到頁表項。頁表項指示着頁框號,頁框號加上線性地址低12位(頁內偏移)就生成了物理地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章