80386開始支持存儲器分頁管理機制。分頁機制是存儲器管理機制的第3二部分。段管理機制實現虛擬地址(由段和偏移構成的邏輯地址)到線性地址的轉換, 分頁管理機制實現線性地址到物理地址的轉換。如果不啟用分頁管理機制,那么線性地址就是物理地址。本文將介紹80386的存儲器分頁管理機制和線性地址如 何轉換為物理地址。
<一>存儲器分頁管理機制
在保護模式下,控制寄存器 CR0 中的最高位 PG 位控制分頁管理機制是否生效。如果 PG=1 ,分頁機制生效,把線性地址轉換為物理地址。 如果PG=0,分頁機制無效,線性地址就直接作為物理地址。必須注意,只有在保護方式下分頁機制才可能生效。只有在保證使PE位為1的前提下,才能夠使 PG位為1,否則將引起通用保護故障。
分頁機制把線性地址空間和物理地址空間分別劃分為大小相同的塊。這樣的塊稱之為頁。通過在線性地址空間的頁與物理地址空間的頁之間建立 的映射,分頁機制實現線性地址到物理地址的轉換。線性地址空間的頁與物理地址空間的頁之間的映射可根據需要而確定,可根據需要而改變。線性地址空間的任何 一頁,可以映射為物理地址空間中的任何一頁。
采用分頁管理機制實現線性地址到物理地址轉換映射的主要目的是便于實現虛擬存儲器。不象段的大小可變,頁的大小是相等并固定的。根據程序的邏輯劃分段,而根據實現虛擬存儲器的方便劃分頁。
在 80386 中,頁的大小固定為 4K 字節,每一頁的邊界地址必須是 4K 的倍數。因此, 4G 大小的地址空間被劃分為 1M 個頁,頁的開始地 址具有“XXXXX000H”的形式。為此,我們把頁開始地址的高20位XXXXXH稱為頁碼。線性地址空間頁的頁碼也就是頁開始邊界線性地址的高20 位;物理地址空間頁的頁碼也就是頁開始邊界物理地址的高20位。可見,頁碼左移12位就是頁的開始地址,所以頁碼規定了頁。
由于頁的大小固定為 4K 字節,且頁的邊界是 4K 的倍數,所以在把 32 位線性地址轉換成 32 位物理地址的過程中,低 12 位地址保持不變。 也就是說,線性地址的低12位就是物理地址的低12位。假設分頁機制采用的轉換映射把線性地址空間的XXXXXH頁映射到物理地址空間的YYYYYH頁, 那么線性地址XXXXXxxxH被轉換為YYYYYxxxH。因此,線性地址到物理地址的轉換要解決的是線性地址空間的頁到物理地址空間的頁的映射,也就 是線性地址高20位到物理地址高20位的轉換。
<二>線性地址到物理地址的轉換
1.映射表結構
線性地址空間的頁到物理地址空間的頁之間的映射用表來描述。由于 4G 的地址空間劃分為 1M 個頁,因此,如果用一張表來描述這種映射,那 么該映射表就要有1M個表項,若每個表項占用4個字節,那么該映射表就要占用4M字節。為避免映射表占用如此巨大的存儲器資源,所以80386把頁映射表 分為兩級。
頁映射表的第一級稱為頁目錄表,存儲在一個 4K 字節的物理頁中。頁目錄表共有 1K 個表項,其中,每個表項為 4 字節長,包含對應第二級表 所在物理地址空間頁的頁碼。頁映射表的第二級稱為頁表,每張頁表也安排在一個4K字節的頁中。每張頁表都有1K個表項,每個表項為4字節長,包含對應物理 地址空間頁的頁碼。由于頁目錄表和頁表均由1K個表項組成,所以使用10位的索引就能指定表項,即用10位的索引值乘以4加基地址就得到了表項的物理地 址。
下圖顯示了由頁目錄表和頁表構成的頁映射表結構。從圖中可見,控制寄存器 CR3 指定頁目錄表;頁目錄表可以指定 1K 個頁表,這些頁表可 以分散存放在任意的物理頁中,而不需要連續存放;每張頁表可以指定1K個物理地址空間的頁,這些物理地址空間的頁可以任意地分散在物理地址空間中。需要注 意的是,存儲頁目錄表和頁表的基地址是對齊在4K字節邊界上的。
2.表項格式
頁目錄表和頁表中的表項都采用如下圖所示的格式。從圖中可見,最高 20 位 ( 位 12 —位31)包含物理地址空間頁的頁碼,也就是物理地址 的高20位。低12位包含頁的屬性。下圖所示的屬性中內容為0的位是Intel公司為80486等處理器所保留的位,在為80386編程使用到它們時必須 設置為0。在位9至位11的AVL字段供軟件使用。表項的最低位是存在屬性位,記作P。P位表示該表項是否有效。P=1表項有效;P=0表項無效,此時表 項中的其余各位均可供軟件使用,80386不解釋P=0的表項中的任何其它的位。在通過頁目錄表和頁表進行的線性地址到物理地址的轉換過程中,無論在頁目 錄表還是在頁表中遇到無效表項,都會引起頁故障。其它屬性位的作用在下文中介紹。
頁目錄表或頁
表的表項格式 BIT31—BIT12 BIT11—BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 物理頁碼 AVL 0 0 D A 0 0 U/S R/W P
3.線性地址到物理地址的轉換
分頁管理機制通過上述頁目錄表和頁表實現 32 位線性地址到 32 位物理地址的轉換??刂萍拇嫫? CR3 的高 20 位作為頁目錄表所在物理頁的 頁碼。首先把線性地址的最高10位(即位22至位31)作為頁目錄表的索引,對應表項所包含的頁碼指定頁表;然后,再把線性地址的中間10位(即位12至 位21)作為所指定的頁目錄表中的頁表項的索引,對應表項所包含的頁碼指定物理地址空間中的一頁;最后,把所指定的物理頁的頁碼作為高20位,把線性地址 的低12位不加改變地作為32位物理地址的低12位。
為了避免在每次存儲器訪問時都要訪問內存中的頁表,以便提高訪問內存的速度, 80386 處理器的硬件把最近使用的線性—物理地址轉換函 數存儲在處理器內部的頁轉換高速緩存中。在訪問存儲器頁表之前總是先查閱高速緩存,僅當必須的轉換不在高速緩存中時,才訪問存儲器中的兩級頁表。頁轉換高 速緩存也稱為頁轉換查找緩存,記為TLB。
在分頁機制轉換高速緩存中的數據與頁表中數據的相關性,不是由 80386 處理器進行維護的,而必須由操作系統軟件保存,也就是說,處理 器不知道軟件什么時候會修改頁表,在一個合理的系統中,頁表只能由操作系統修改,操作系統可以直接地在軟件修改頁表后通過刷新高速緩存來保證相關性。高速 緩存的刷新通過裝入處理器控制寄存器CR3完成,實際過程可能用如下的兩條指令實現:
mov eax,cr3
mov cr3,eax
一個重要的修改頁表項的特殊情況不需要對頁轉換高速緩存刷新,這種情況是指修改不存在表項的任一部分,即使 P 位本身從 P=0 改變為 P=1時也一樣,因為無效的表項不會存入高速緩存。因此,當無效的表項被改變時,不需要刷新高速緩存。這表明在從磁盤上讀入一頁使其存在時,不必刷新高速 緩存。
在一個多處理器系統中,必須特別注意是否在一個處理器中執行的程序,會改變可能由另外的處理器同時訪問的頁表。在 80386 處理器中, 每當要更新頁表項并設置D位和A位時,通過使用不可分的讀/修改/寫周期支持多處理器的配置。對于頁表項的軟件更新需要借助于使用LOCK前綴,從而保證 修改頁表的指令工作在不可分的讀/修改/寫周期中。在改變一個可能由另外的處理器使用的頁表之前,最好使用一條加鎖的AND指令在一個不可分的操作中將P 位清除為0,然后,該表項可根據要求進行修改,并隨后把P位置成1而使表項成為可用。當修改頁表項時必須及時通知(通常使用中斷方式)系統中該表項已被高 速緩存的所有處理器刷新各自的頁轉換高速緩存,以撤消該表項的舊拷貝。在表項的舊拷貝被刷新之前,各處理器仍可繼續訪問舊的頁,并可以設置正被修改的表項 的D位。如果這樣做引起表項修改失敗,則分頁機制高速緩存最好在標記為不存在之后,并在對表項進行另外的修改之前進行刷新。
4.不存在的頁表
采用上述頁映射表結構,存儲全部 1K 張頁表需要 4M 字節,此外還需要 4K 字節用于存儲頁目錄表。這樣的兩級頁映射表似乎反而比單一的整 張頁映射表多占用4K字節。其實不然,事實上不需要在內存中存儲完整的兩級頁映射表。兩級頁映射表結構中對于線性地址空間中不存在的或未使用的部分不必分 配頁表。除必須給頁目錄表分配物理頁外,僅當在需要時才給頁表分配物理頁,于是頁映射表的大小就對應于實際使用的線性地址空間大小。因為任何一個實際運行 的程序使用的線性地址空間都遠小于4G字節,所以用于分配給頁表的物理頁也遠小于4M字節。
頁目錄表項中的存在位 P 表明對應頁表是否有效。如果 P=1 ,表明對應頁表有效,可利用它進行地址轉換;如果 P=0 ,表明對應頁表無效。 如果試圖通過無效的頁表進行線性地址到物理地址的轉換,那么將引起頁故障。因此,頁目錄表項中的屬性位P使得操作系統只需給覆蓋實際使用的線性地址范圍的 頁表分配物理頁。
頁目錄表項中的屬性位 P 頁可用于把頁表存儲在虛擬存儲器中。當發生由于所需頁表無效而引起的頁故障時,頁故障處理程序再申請物理頁,從 磁盤上把對應的頁表讀入,并把對應頁目錄表項中的P位置1。換言之,可以當需要時才為所要的頁表分配物理頁。這樣頁表占用的物理頁數量可降到最小。
5.頁的共享
由上述頁映射表結構可見,分頁機制沒有全局頁和局部頁的規定。每一個任務可使用自己的頁映射表獨立地實現線性地址到物理地址的轉換。但是,如果使每一個任務所用的頁映射表具有部分相同的映射,那么也就可以實現部分頁的共享。
常用的實現頁共享的方法是線性地址空間的共享,也就是不同任務的部分相同的線性地址空間的映射信息相同,具體表現為部分頁表相同或頁表 內的部分表項的頁碼相同。例如,如果任務A和任務B分別使用的頁目錄表A和頁目錄表B內的第0項中的頁碼相同,也就是頁表0相同,那么任務A和任務B的 00000000H至003FFFFFH線性地址空間就映射到相同的物理頁。再如,任務A和任務B使用的頁表0不同,但這兩張頁表內第0至第0FFH項的 頁碼對應相同,那么任務A和任務B的00000000H至000FFFFFH線性地址空間就映射到相同的物理頁。
需要注意的是,共享的頁表最好由兩個頁目錄中同樣的目錄項所指定。這一點很重要,因為它保證了在兩個任務中同樣的線性地址范圍將映射到該全局區域。
<三>頁級保護和虛擬存儲器支持
1.頁級保護
80386 不僅提供段級保護,也提供頁級保護。分頁機制只區分兩種特權級。特權級 0 、 1 和 2 統稱為系統特權級,特權級 3 稱為用戶特權級。在上圖所示頁目錄表和頁表的表項中的保護屬性位 R/W 和 U/S 就是用于對頁進行保護。
表項的位 1 是讀寫屬性位,記作 R/W 。 R/W 位指示該表項所指定的頁是否可讀、寫或執行。若 R/W=1 ,對表項所指定的頁可進行讀、寫 或執行;若R/W=0,對表項所指定的頁可讀或執行,但不能對該指定的頁寫入。但是,R/W位對頁的寫保護只在處理器處于用戶特權級時發揮作用;當處理器 處于系統特權級時,R/W位被忽略,即總可以讀、寫或執行。
表項的位 2 是用戶 / 系統屬性位,記作 U/S 。 U/S 位指示該表項所指定的頁是否是用戶級頁。若 U/S=1 ,表項所指定的頁是用戶級頁, 可由任何特權級下執行的程序訪問;如果U/S=0,表項所指定的頁是系統級頁,只能由系統特權級下執行的程序訪問。下表列出了上述屬性位R/W和U/S所 確定的頁級保護下,用戶級程序和系統級程序分別具有的對用戶級頁和系統級頁進行操作的權限。
頁級
保護
屬性 U/S R/W 用戶級訪問權限系統級訪問權限 0 0 無讀/寫/執行 0 1 無讀/寫/執行 1 0 讀/執行讀/寫/執行 1 1 讀/寫/執行讀/寫/執行
由上表可見,用戶級頁可以規定為只允許讀 / 執行或規定為讀 / 寫 / 執行。系統級頁對于系統級程序總是可讀 / 寫 / 執行,而對用戶級程序總是 不可訪問的。于分段機制一樣,外層用戶級執行的程序只能訪問用戶級的頁,而內層系統級執行的程序,既可訪問系統級頁,也可訪問用戶級頁。與分段機制不同的 是,在內層系統級執行的程序,對任何頁都有讀/寫/執行訪問權,即使規定為只允許讀/執行的用戶頁,內層系統級程序也對該頁有寫訪問權。
頁目錄表項中的保護屬性位 R/W 和 U/S 對由該表項指定頁表所指定的全部 1K 各頁起到保護作用。所以,對頁訪問時引用的保護屬性位 R /W 和 U/S 的值是組合計算頁目錄表項和頁表項中的保護屬性位的值所得。下表列出了組合計算前后的保護屬性位的值,組合計算是“與”操作。
組合頁的
保護>屬性目錄表項U/S 頁表項U/S 組合U/S 目錄表項R/W 頁表項R/W 組合R/W 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1
正如在 80386 地址轉換機制中分頁機制在分段機制之后起作用一樣,由分頁機制支持的頁級保護也在由分段機制支持的段級保護之后起作 用。先測試有關的段級保護,如果啟用分頁機制,那么在檢查通過后,再測試頁級保護。如果段的類型為讀/寫,而頁規定為只允許讀/執行,那么不允許寫;如果 段的類型為只讀/執行,那么不論頁保護如何,也不允許寫。
頁級保護的檢查是在線性地址轉換為物理地址的過程中進行的,如果違反頁保護屬性的規定,對頁進行訪問 ( 讀 / 寫 / 執行 ) ,那么將引起頁異常。
2.對虛擬存儲器的支持
頁表項中的 P 位是支持采用分頁機制虛擬存儲器的關鍵。 P=1 ,表示表項指定的頁存在于物理存儲器中,并且表項的高 20 位是物理頁的頁 碼;P=0,表示該線性地址空間中的頁所對應的物理地址空中的頁不在物理存儲器中。如果程序訪問不存在的頁,會引起頁異常,這樣操作系統可把該不存在的頁 從磁盤上讀入,把所在物理頁的頁碼填入對應表項并把表項中的P位置為1,然后使引起異常的程序恢復運行。
此外,表項中的訪問位 A 和寫標志位 D 也用于支持有效地實現虛擬存儲器。
表項的位 5 是訪問屬性位,記作 A 。在為了訪問某存儲單元而進行線性地址到物理地址的轉換過程中,處理器總是把頁目錄表內的對應表項和其 所指定頁表內的對應表項中的A位置1,除非頁表或頁不存在,或者訪問違反保護屬性規定。所以,A=1表示已訪問過對應的物理頁。處理器永不清除A位。通過 周期性地檢測及清除A位,操作系統就可確定哪些頁在最近一段時間未被訪問過。當存儲器資源緊缺時,這些最近未被訪問的頁很可能就被選擇出來,將它們從內存 換出到磁盤上去。
表項的位 6 是寫標志位,記作 D 。在為了訪問某存儲單元而進行線性地址到物理地址的轉換過程中,如果是寫訪問并且可以寫訪問,處理器就把 頁表內對應表項中的D位置1,但并不把頁目錄表內對應表項中的D置1。當某頁從磁盤上讀入內存時,頁表中對應對應表項的D位被清0。所以,D=1表示已寫 過對應的物理頁。當某頁需要從內存換出到磁盤上時,如果該頁的D位為1,那么必須進行寫操作(把內存中的頁寫入磁盤時,處理器并不清除對應頁表項的D 位)。但是,如果要寫到磁盤上的頁的D位為0,那么不需要實際的磁盤寫操作,而只要簡單地放棄內存中該頁即可。因為內存中的頁與磁盤中的頁具有完全相同的 內容。
<四>頁異常
啟用分頁機制后,線性地址不再直接等于物理地址,線性地址要經過分頁機制轉換才成為物理地址。在轉換過程中,如果出現下列情況之一就會引起頁異常:
(1) 涉及的頁目錄表內的表項或頁表內的表項中的 P=0 ,即涉及到頁不在內存;
(2) 發現試圖違反頁保護屬性的規定而對頁進行訪問。
報告頁異常的中斷向量號是 14(0EH) 。頁異常屬于故障類異常。在進入故障處理程序時,保存的指令指針 CS 及 EIP 指向發生故障的指令。一旦引起頁故障的原因被排除后,即可從頁故障處理程序通過一條 IRET 指令,直接地重新執行產生故障的指令。
當頁故障發生時,處理器把引起頁故障的線性地址裝入 CR2 。頁故障處理程序可以利用該線性地址確定對應的頁目錄項和頁表項。
頁故障還在堆棧中提供一個出錯碼,出錯碼的格式如下圖所示。其中,U位表示引起故障程序的特權級,U=1表示用戶特權級(特權級3),U=0表 示系統特權級(特權級0、1或2);W位表示訪問類型,W=0表示讀/執行,W=1表示寫;P位表示異常類型,P=0表示頁不存在故障,P=1表示保護故 障。頁故障的響應處理模式同其它故障一樣。
出錯碼
的格式 BIT15—BIT3 BIT2 BIT1 BIT0 未使用 U W P
源文檔 < http://hi.baidu.com/lovetolinux/blog/item/4b572489ceae7398a4c272d6.html >
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
