80x86微處理器有實地址、保護虛地址和虛擬8086 三種模式的存儲管理機制。
實地址模式是CPU初始化后工作的基本模式,它相當于一個高速的8086CPU。在實地址模式下,系統32位地址總線只能使用低20位(即 A19~A0),可尋址的有效地址空間為1MB。實地址模式下不支持虛擬存儲器管理方式,程序只能在實地址空間內運行,由于CPU中用來尋址的寄存器是 16位,為了能尋址1MB的內存空間,實地址模式存儲器采用分段的存儲結構進行管理。但這種分段方式與虛擬存儲器中的分段方式概念不同,前者指的是對實存 (內存)空間的分段,而后者指的是對虛存空間的分段。
保護虛地址模式引入了虛擬存儲器的概念,可支持多任務操作。在保護模式下,32 位CPU可訪問的物理存儲空間為4GB(232字節),程序可用的虛擬存儲空間為64TB(246字節)。保護模式支持4種特權級,可以隔離和保護操作系 統的核心代碼不受用戶軟件的破壞,防止應用程序之間的干擾。
虛擬8086模式是一種既有保護功能又能執行16位微處理器軟件的工作方式。虛擬8086模式的工作原理與保護模式相同,但程序指定的邏輯地址解釋與8086微處理器相同。虛擬8086模式可以看做是保護模式的一種子方式。
80x86微處理器的實地址存儲器管理方式已在第2章中做過詳細介紹,本節重點討論保護模式和虛擬8086模式存儲器管理方式。
5.7.280x86保護模式存儲管理
80x86微處理器工作在保護模式時對存儲器的管理有兩個特點:一是引入了分段分頁虛擬存儲器管理機制、二是引入了對存儲器的保護機制。
1.分段分頁存儲器管理
32位微處理器的虛擬存儲空間最大可達64TB(246字節),使用46位虛擬地址,采用分段分頁管理機制,段的最大長度為4GB,段數最大可達16K 個。頁的大小因CPU不同而異:80386/80486每頁固定在4KB。Pentium允許頁面擴大到4MB,由控制寄存器CR4中的第4位PSE來控 制頁的大小。當PSE為1時,頁面大小為4MB;當PSE為0時,頁面大小為4KB。
分段分頁存儲器工作原理與上節介紹的相同:首先 將虛擬地址空間分成若干個大小不等的邏輯段,邏輯地址由間接指向段基址的16位段選擇符和32位段內偏移量兩部分組成,并由分段機制將46位邏輯地址轉換 為32位線性地址(線性地址空間是一個不分段的、連續的地址空間地址空間的轉換),然后再將線性地址空間等分為固定大小的若干頁,將線性地址用頁基址和頁 內偏移量表示,以頁為單位進行地址映射,并由分頁機制將32位線性地址轉換為32位物理地址。
2.分段方式中的地址轉換
分段方式中的地址轉換原理如虛線左側部分所示。程序中的邏輯地址由16位段選擇符(通過段選擇符可獲得32位段基址)和32位段內偏移量構成。邏輯地址 中的16位段選擇符在程序執行時裝載到相應的段寄存器CS、DS、SS、ES、GS、FS中,用來選擇邏輯地址空間中的一個特定的段;32位偏移量由指令 中的尋址方式給出。
段選擇符16位長:13位索引(Index)、1位表選擇位(TI)和2位請求特權級(RPL)。其中,請求特權級不用于段選擇,即16位中只有14位用于段選擇,可尋址16K個邏輯段,加上每個段最大可達4GB,使32位微處理器的虛擬存儲空間可達64TB。
由程序給出的邏輯地址通過描述符表中的描述符數組進行轉換。邏輯地址在段寄存器CS、DS、ES、SS、FS、GS中的選擇符用做在全局描述符表GDT 或局部描述符表LDT中索引段描述符。每當段選擇符裝入段寄存器時,由索引指向的段描述符自動從TI位所選定的GDT或LDT中取出,段描述符中的32位 段基址與邏輯地址中的32位偏移量相加即得到32位線性地址。若不啟用分頁機制(控制寄存器CR0的PG0)時,線性地址就是物理地址。
3.分頁方式中的地址轉換
當控制寄存器CR0的PG位置1時,就啟用了分頁存儲器管理機制,它自動地把線性地址空間中的任何一頁映射到物理空間的一頁,將線性地址轉換成物理地址。
分頁方式中的線性地址到物理地址的轉換是由駐留在內存中的頁表來完成的。為了節省頁表所占的內存空間,32位CPU采用兩級頁表機構:第一級用210個 表項構成頁目錄表,每項4個字節,共有1024項,占4KB內存,其物理基址由CR3控制寄存器提供;第二級也是由210個表項構成頁表,每項也是4個字 節,最多1024個頁表,占4KB內存。這樣,兩級頁表組合起來只占8KB內存,即可描述220個表項。