保護模式下的分段記憶體定址
段選擇符(段暫存器中的值)
32位彙編中16位段暫存器(CS、DS、ES、SS、FS、GS)中不再存放段基址,而是段描述符在段描述符表中的索引值,D3-D15位是索引值,D0-D1位是請求特權級(RPL)用於特權檢查,D2位是描述符表引用指示位TI,TI=0指 示從全域性描述表GDT中讀取描述符,TI=1指示從區域性描述符中LDT中讀取描述符。這些資訊總稱段選擇符(段選擇子).
關於特權級的說明:任務中的每一個段都有一個特定的級別。每當一個程式試圖訪問某一個段時,就將該程式所擁有的特權級與要訪問的特權級進行比較,以決定能否訪問該段。系統約定,CPU只能訪問同一特權級或級別較低特權級的段。
段描述符
佔8個位元組64位,每一個段都有一個對應的描述符。根據描述符所描述的物件不同,描述符可分為三類:儲存段描述符,系統段描述符,門描述符(控制描述 符)。在描述符中定義了段的基址,限長和訪問內型等屬性。其中基址給出該段的基礎地址,用於形成線性地址;限長說明該段的長度,用於儲存空間保護;段屬性 說明該段的訪問許可權、該段當前在記憶體中的存在性,以及該段所在的特權級。
以下是描述符表中的一項描述符的定義:
段描述符表
IA-32處理器把所有段描述符按順序組織成線性表 放在記憶體中,稱為段描述符表。分為三類:全域性描述符表GDT,區域性描述符表LDT和中斷描述符表IDT。GDT和IDT在整個系統中只有一張,而每個任務 都有自己私有的一張區域性描述符表LDT,用於記錄本任務中涉及的各個程式碼段、資料段和堆疊段以及本任務的使用的門描述符。GDT包含系統使用的程式碼段、數 據段、堆疊段和特殊資料段描述符,以及所有任務區域性描述符表LDT的描述符。
全域性描述符表GDT
全域性描述符表GDT(Global Descriptor Table):在整個系統中,全域性描述符表GDT只有一張(一個處理器對應一個GDT),GDT可以被放在記憶體的任何位置,但CPU必須知道GDT的入口,也就是基地址放在哪裡,Intel的設計者門提供了一個暫存器GDTR用來存放GDT的入口地址,程式設計師將GDT設定在記憶體中某個位置之後,可以通過LGDT指令將GDT的入口地址裝入此暫存器,從此以後,CPU就根據此暫存器中的內容作為GDT的入口來訪問GDT了。GDTR中存放的是GDT在記憶體中的基地址和其表長界限。
注意:GDT的第一項總為空,且稱為空段描述符,指向GDT中該描述符的選擇器被稱為空選擇器。
GDTR全域性描述符表暫存器
48位,高32位存放GDT基址,低16為存放GDT限長。
區域性描述符表LDT
區域性描述符表LDT(Local Descriptor Table):區域性描述符表可以有若干張,每個任務可以有一張。
LDTR區域性描述符表暫存器
LDTR暫存器儲存了16位段選擇符、32位基地址、16位段界限和LDT描述符屬性。基地址是指LDT的0位元組的線性地址。
LLDT指令:裝載LDTR暫存器中的段選擇符(16位)那部分。
SLDT指令:儲存LDTR暫存器中的段選擇符(16位)那部分。
16位段選擇符中,高13位存放LDT在GDT中的索引值。
保護模式下分段記憶體定址
IA-32處理器仍然可以使用xxxx:yyyyyyyy(段選擇器:偏移量)樣式的邏輯地址來表示一個線性地址。那麼CPU是如何將這樣的一個邏輯地址轉換成一個線性地址呢?首先,要獲取邏輯地址所在段的基地址。那麼要怎樣才能得到段的基址呢?在上面說明中我們知道,要得到段的基址首先通過段選擇符xxxx中TI位指定的段描述符所在位置: 當 TI=0時表示段描述符在GDT中,如下圖所示:① 先從GDTR暫存器中獲得GDT基址。② 然後再GDT中以段選擇符高13位位置索引值得到段描述符。③ 段描述符符包含段的基址、限長、優先順序等各種屬性,這就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最後的線性地址。
當TI=1時表示段描述符在LDT中,如下圖所示:① 還是先從GDTR暫存器中獲得GDT基址。② 從LDTR暫存器中獲取LDT所在段的位置索引(LDTR高13位)。③ 以這個位置索引在GDT中得到LDT段描述符從而得到LDT段基址。④ 用段選擇符高13位位置索引值從LDT段中得到段描述符。⑤ 段描述符符包含段的基址、限長、優先順序等各種屬性,這就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最後的線性地址。
例子:
給出邏輯地址:21h:12345678h,將其轉換為線性地址
a. 選擇子SEL=21h=0000000000100 0 01b 他代表的意思是:選擇子的index=4即100b,選擇GDT中的第4個描述符;TI=0代表選擇子是在GDT選擇;左後的01b代表特權級RPL=1
b. OFFSET=12345678h,若此時GDT第四個描述符中描述的段基址(Base)為11111111h,則線性地址=11111111h+12345678h=23456789h
參考連線: