分段地址轉換
過程
將邏輯地址轉為線性地址,處理器會執行以下操作:
- 使用段選擇符定位到GDT或LDT表中的段描述符。(僅當一個新的段選擇符加載到段寄存器中才需要這一步)
- 先根據相應描述符表寄存器中的段地址(確定描述符表的地址)和段界限(確定描述符表的大小),根據段選擇符的TI決定從哪種描述符表中取,再根據段選擇符的索引找到相應段描述符的位置,比較RPL與DPL,若該段無問題,就取出相應的段描述符放入段描述符高速緩沖寄存器中。
- 從段描述符中取得32 位段基地址加到32位偏移量上,形成線性地址。
描述符
64位
包含段基地址,大小,段類型等信息。
段描述符是處理器用來把邏輯地址映射為線性地址的必要數據結構。描述符是由編譯器、連接器、加載器、或者是操作系統生成的,不能由應用程序員生成。圖5-3顯示了兩種常用的描述符的格式。所有的段描述符都是這兩種格式當中的一種。段描述符的字段是以下:
基址(BASE****):決定了一個段在4G線性地址空間中的位置。處理器把3部分基址聯接在一起,來形成一個32位的基址。
界限(LIMIT****):決定了一個段的大小。處理器用2部分的界限字段來形成一個20位的界限值。處理器以兩種方式來解析界限的值,解析方式取決於粒度位的設置情況:
1、 當單元大小為一個字節時,則定義了一個最大為1M字節的段。
2、 如果單元大小為4K字節,則段大小可以高達4G。界限值在使用之前處理器將會把它先左移12位,低12位則自動插入0。
粒度位(Granularity bit****):決定了界限值被處理器解析的方式。當它被復位時,界限值被解析為以1字節為一個單元。當它置位時,則界限值以4K為一個單元。
類型(TYPE****):用於區別不同類型的描述符。
描述符特權級(Descriptor Privilege Level)(DPL):用來實現保護機制(參看第六章)。
段存在位(Segment-Present bit****):如果這一位為0,則此描述符為非法的,不能被用來實現地址轉換。如果一個非法描述符被加載進一個段寄存器,處理器會立即產生異常。圖5-4顯示了當存在位為0時,描述符的格式。操作系統可以任意的使用被標識為可用(AVAILABLE)的位。一個實現基於段的虛擬內存的操作系統可以在以下情況下來清除存在位:
1、 當這個段的線性地址空間並沒有完全被分頁系統映射到物理地址空間時。
2、 當段根本沒有在內存里時。
已訪問位(Accessed bit****):當處理器訪問該段時,將自動設置訪問位。也就是說,當一個指向該段描述符的選擇子被加載進一個段寄存器時或者當被一條選擇子測試指令使用時。在段級基礎上實現虛擬內存的操作系統可能會周期性的測試和清除該位,從而監視一個段的使用情況。
創建和維擬描述符是系統軟件的任務,一般說來可能是由,編譯器、程序加載器、系統生成器、或者操作系統來協作完成的。
描述符表(DT)
段描述符存儲在以下兩種描述符表中的一個:
- 全局描述符表GDT
- 局部描述符表LDT
本質是一個包含了很多描述符的8字節內存數組,長度可變,最多包含8192(2^13)個描述符
如何定位:通過GDTR和LDTR來定位內存中的全局描述符表和當前的局部描述符表。
這些寄存器存儲了這些表的線性地址的基址和段長界限。指令LGDT和SGDT是用業訪問全局描述符表寄存器的,而指令LLDT和SLDT則是用來訪問局部描述符表寄存器的。
選擇子(段選擇符)
用於定位段描述符
在段寄存器內存放,段選擇符(16位)+偏移量(32位)=邏輯地址
16位
線性地址部分的選擇子是用來選擇哪個描述符表和在該表中索引一個描述符的。
段選擇符的3個字段分別是:
請求特權級RPL(Requested Privilege Level)
表指示標志TI(Table Index)
索引值(Index)
索引字段給出了描述符在GDT或LDT表中的索引項號
表索引字段TI用來選擇描述符表。
TI=0表示描述符在GDT中;TI=1表示描述符在LDT中
請求特權級字段RPL提供了段保護信息