1. 程式人生 > >保護模式及其程式設計——分頁機制

保護模式及其程式設計——分頁機制

摘要:分頁機制是實現虛擬儲存的關鍵,但是它的實現比較簡單。傳統的頁都是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4K</span></span>大小,當然,在最近的核心中,分頁機制因為一些原因而比較繁瑣。在這裡,我們僅僅淺談最簡單的分頁機制,在其他的文章中,我們將講解現代新<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">linux</span></span>核心中的分頁機制。

我們通過設定<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">cr0</span></span>的<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">PG</span></span>位來開啟分頁機制。頁大小是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4K</span></span>,並且是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4K</span></span>對齊的。線性地址到實體地址的轉換中,可能某些線性地址是無效的。如果某個線性地址對應的頁不存在,那麼訪問的時候將產生一個異常。分頁和分段最大的不同就是分頁是固定大小的。為了減少地址轉化需要的匯流排週期數量,我們使用<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">TLB</span></span>快取最近使用的頁表。

<h1 style="margin: 0px; padding: 0px;"><a target=_blank name="t0" style="color: rgb(202, 0, 0);"></a><span style="font-size: 18px; color: rgb(255, 0, 0);"><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1.</span></span>頁表結構</span></h1>
<h2 style="margin: 0px; padding: 0px;"><a target=_blank name="t1" style="color: rgb(202, 0, 0);"></a><span style="font-size: 18px; color: rgb(255, 0, 0);"><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1.1</span></span>兩級頁表結構</span></h2>頁表中,每項的大小是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">32b</span></span>,其中<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">20b</span></span>用來存放頁面的實體地址,<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">12b</span></span>用於存放屬性資訊。

頁表含有<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1M</span></span>個表項,每項<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4B.</span></span>第一級表是頁目錄,存放在<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1</span></span>頁<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4k</span></span>頁面中,含有<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1K</span></span>個表項。第二級是頁表,也是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1K</span></span>個表項。二級頁表的查詢過程如下圖
<img src="https://img-blog.csdn.net/20140219212854015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJvY2hpbHVzZXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border: none; max-width: 100%;" />
<h2 style="margin: 0px; padding: 0px;"><a target=_blank name="t2" style="color: rgb(202, 0, 0);"></a><span style="font-size: 18px; color: rgb(255, 0, 0);"><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">1.2.</span></span>不存在的頁表</span></h2>頁目錄表的每個表項都有一個<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">present</span></span>屬性,這個屬性可以節省存放頁表所需要的空間。另外,這個屬性還可以用於在虛擬記憶體中存放二級頁表。這意味著,任何時候只有部分二級頁表在實體記憶體中,其餘可以儲存在磁碟上。

<h1 style="margin: 0px; padding: 0px;"><a target=_blank name="t3" style="color: rgb(202, 0, 0);"></a><span style="font-size: 18px; color: rgb(255, 0, 0);"><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">2.</span></span>頁表項格式</span></h1>
頁表項格式如下圖:

<img src="https://img-blog.csdn.net/20140219212909781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJvY2hpbHVzZXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border: none; max-width: 100%;" />
其中屬性位包含如下資訊:
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">P——b0</span></span>,存在位標誌
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">R/W——b1</span></span>,讀寫位標誌
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">U/S——b2</span></span>,使用者<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">/</span></span>超級使用者標誌
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">A——b5</span></span>,已經訪問標誌
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">D——b6</span></span>,髒位標誌
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">AVL——</span></span>保留欄位
G:第8b,表示全域性頁
<span style="font-size: 14.44444465637207px;">保護模式是否開啟,取決於cr0的第0位PG。</span>
<span style="font-size: 14.44444465637207px;">
</span>
<span style="font-size: 14.44444465637207px;">有關資料結構;一個頁表或者頁目錄項大小是4B;而開啟分頁機制以後,儲存單元變成了頁(不存在說,一部分儲存開啟了分頁機制,另外一部分沒有開啟分頁機制(除非這部分不能通過作業系統訪問到))。所以,一個頁上含有1024個頁表項;一個頁目錄,對應1K*4K=4M的空間;一個程式有4G的線性地址空間,正好需要1K個頁目錄來儲存,它佔用的頁表是4M.</span>
<span style="font-size: 14.44444465637207px;">
</span>
<span style="font-size: 14.44444465637207px;">另外,頁表和頁目錄表都表項都是32b的,其中地址對應的是20b(第12b清零)。</span>
<span style="font-size: 14.44444465637207px;">
</span>
<span style="font-size: 14.44444465637207px;">當頁目錄或者頁表項被修改的時候,對應TLB中的專案也就失效了;當cr3重新載入的時候,所有的TLB都失效了(G標誌為1的除外)</span>
<span style="font-size: 14.44444465637207px;">因為頁目錄基地址是4K對齊的,所以CR3中僅用20b來儲存它的基地址。</span>