【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解
上一篇文章學習了:保護模式九:段頁式內存管理機制概述
本篇文章接著學習以下內容:
- 頁目錄概念
- 頁表概念
- 頁目錄、頁表與頁之間的關系
- 虛擬地址(線性地址)到物理地址的具體變換過程。
1、頁目錄、頁表和頁的對應關系
第一個支持分頁式內存管理的是Intel80386處理器。
我們知道,在上一篇文章學習的頁映射表,是一個具有1048576個頁表項的一維表格。又因為每個表項占4字節,所以,映射表的大小是4MB。是的,它很大!!!
為了解決這個占用內存過大的頁映射表,分頁機制采用了層次化的分頁結構。具體實際上就是不采用單一的頁映射表,而是將一個巨大的頁映射表分成兩個層次。如下圖:
如上圖,我們可以讓一個頁目錄指向1024個頁表。然后讓這1024個頁表中的頁表項再指向所對應的物理內存空間的具體頁。
- 每個頁表可以指向1024個頁,因為每個頁表項是4字節的,所以每個頁表的大小是4KB,剛好是一個頁面的大小。
- 頁目錄可以指向1024個頁表,同樣也是4KB,剛好是一個頁面的大小。
- 因為頁目錄和頁表都剛好是一個頁面的大小,所以頁目錄和頁表都可以被當成普通的頁存放于物理內存的頁中。
- 注意,頁在頁表內的分布是隨機的。老任務不停的關閉,新任務不停的開始,頁面的回收和再分配沒有什么規律可言。
以上的層次化結構是每個任務都有的。或者說,每個任務都有自己的頁目錄,頁表。
如下圖,在處理器內部有一個控制寄存器CR3,存放著當前任務頁目錄的物理地址。故又叫做頁目錄基址寄存器(PDBR)。
每個任務都有自己的任務狀態段TSS。它是任務的標志性結構,存放了和任務相關的各種數據,其中就包括CR3寄存器域,存放了任務自己的頁目錄物理地址。
當任務切換時,處理器切換到新任務執行,而CR3寄存器的內容也要被更新,以指向新任務的頁目錄地址。相應的頁目錄又指向一個個頁表,這就使得每個任務都只在自己的地址空間內運行。
從上圖中可以看出,頁目錄和頁表也是普通的物理頁,混跡于全部的物理頁中。它們和普通的頁的唯一不同就是功能不同。當任務撤銷后,它們和任務所占用的普通物理頁一樣會被回收,并分配給其他任務。
下面我們看一下在多任務環境下,頁目錄表和頁表映射示意圖:
需要注意的就是全局地址空間,所有的任務的頁目錄對應的全局地址空間的那些頁目錄項,都是一樣的,因為所有任務共享全局地址空間。
2、虛擬地址(線性地址)到物理地址的具體變換過程
現在有了分頁,最簡單和最基本的機制就是:CR3寄存器給出了頁目錄的物理基地址;頁目錄給出了所有頁表的物理地址;而每個頁表給出了它所包含的頁的物理地址。
上面該清楚的都清楚了,唯一不明白的是,應該如何使用這種層次化結構來把線性地址轉換成物理地址。
如下圖:
- 假設現在段部件給出的線性地址是0x00801050
- 處理器將段部件送過來的線性地址分成三段,高10位:中間10位:低12位。高10位用于索引頁目錄;中間10位用于索引頁表;低12位則是頁內偏移地址
- 最終我們得到真實的物理地址0x0000C050。這就是處理器要訪問的真實的物理地址
上述圖示很清晰,我們這里不再贅述詳細的轉換過程。
我們唯一需要注意的是:這種變換不是無緣無故的。而是事先安排好的。這其實還是一個反過程:
- 首先當任務加載時,操作系統先創建虛擬的內存段,并根據段地址的高20位決定它要用到哪些頁目錄項和頁表項。
- 然后尋找空閑的頁,將原本應該寫入段(因為是虛擬段,所以這里說原本)的數據,寫到一個或者多個物理頁中,并將頁的物理地址填寫到相應的頁表中。
- 只有這樣提前將頁表填好,在程序真正執行的時候,才能以相反的順序,從頁表中再取出之前填好的頁的物理地址,去相應的物理內存中取指令執行或者找到相應的數據。
- 這就是一個反過程。在上一篇文章中也有類似的過程。
3、總結
本文學習了:
- 頁目錄、頁表和頁之間的關系
- 虛擬地址(線性地址)到物理地址的轉換過程
詳細的內容還是要參考原書籍,這里只是做一個簡單的總結。
學習探討加個人:
qq:1126137994
微信:liu1126137994
總結
以上是生活随笔為你收集整理的【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电商扣减库存_外贸电商仓储:代打包代贴单
- 下一篇: 思科为计算机配置ip命令,cisco路由