保護模式下的分段記憶體定址

2021-07-02 22:04:11 字數 2306 閱讀 3470

段選擇符(段暫存器中的值)

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處理器仍然可以使用***x:yyyyyyyy(段選擇器:偏移量)樣式的邏輯位址來表示乙個線性位址。那麼cpu是如何將這樣的乙個邏輯位址轉換成乙個線性位址呢?首先,要獲取邏輯位址所在段的基位址。那麼要怎樣才能得到段的基址呢?在上面說明中我們知道,要得到段的基址首先通過段選擇符***x中ti位指定的段描述符所在位置: 當 ti=0時表示段描述符在gdt中,如下圖所示:① 先從gdtr暫存器中獲得gdt基址。② 然後再gdt中以段選擇符高13位位置索引值得到段描述符。③ 段描述符符包含段的基址、限長、優先順序等各種屬性,這就得到了段的起始位址(基址),再以基址加上偏移位址yyyyyyyy才得到最後的線性位址。

當ti=1時表示段描述符在ldt中,如下圖所示:① 還是先從gdtr暫存器中獲得gdt基址。② 從ldtr暫存器中獲取ldt所在段的位置索引(ldtr高13位)。③ 以這個位置索引在gdt中得到ldt段描述符從而得到ldt段基址。④ 用段選擇符高13位位置索引值從ldt段中得到段描述符。⑤ 段描述符符包含段的基址、限長、優先順序等各種屬性,這就得到了段的起始位址(基址),再以基址加上偏移位址yyyyyyyy才得到最後的線性位址。

例子:

X86保護模式下的記憶體定址

段選擇器 32位彙編中16位段暫存器 cs ds es ss fs gs 中不再存放段基址,而是段描述符在段描述符表中的索引值,d3 d15位是索引值,d0 d1位是優先順序 rpl 用於特權檢查,d2位是描述符表引用指示位ti,ti 0指示從全域性描述表gdt中讀取描述符,ti 1指示從區域性描述...

實模式與保護模式的定址

暫存器運算元 存放在cpu中 mov ax,0ffffh ax 即為暫存器運算元。運算元本身存放於暫存器中,在指令中只是給出了幾個位的 來表示它具體存放在那個暫存器中。記憶體中的資料經過暫存器讀入cpu,進入資料的運算。記憶體運算元 存放在記憶體中 其儲存於某記憶體區域,因此叫記憶體運算元。myda...

實模式與保護模式下的分段分頁機制

在實模式下,cpu不會為任務提供任務的保護機制,任意執行。8086處理器是學習實模式的常用例子。它內部大致有以下暫存器 段暫存器 專用暫存器 保護模式是指cpu從硬體機制上提供了使用者程式對記憶體的訪問限制,為多使用者多工的程式進行了彼此隔離,防止因某個程式的編寫錯誤影響到作業系統和其它使用者。保護...