80386虛模式記憶體管理(1)

2021-05-22 01:06:27 字數 1792 閱讀 8548

這些轉換對應用程式時不可見的,圖1從巨集觀上面描述了這兩種轉換:

圖1 位址轉換概況

1、段轉換

圖2詳細描述了段轉換的情況,在這個轉換過程中,cpu用到如下的資料結構:

描述符(descriptor)

描述符表(descriptor tables)

選擇子(selector)

段暫存器(segment registers)

圖2 段轉換

1)段暫存器和選擇子

段暫存器就是指的是cs,ds,ss,es,fs,gs。在實模式下面段暫存器存放著16位段位址,該段位址加上偏移位址就是實體地址。在虛模式下面,段位址需要查表來得到,段位址存放在描述符表(descriptor table)中。段暫存器裡面存放的是16位選擇子(selector),該選擇子是描述附表的索引值,通過選擇子就可以找到段位址,然後段位址加上32位的偏移位址就是線性位址(注意不是實體地址,有可能需要頁轉換)。

選擇子的格式如下:

圖3 選擇子的格式

a) 表型別指示(ti):位於選擇子的第2位。指明該選擇子指示的是全域性描述表(gdt)還是本地描述表(ldt),設0表示gdt,設1表示ldt。gdt和ldt在描述符表中介紹。

b) 請求許可權級別(rpl):位於選擇子的0,1位,表明段訪問的優先順序,用於cpu的保護機制。

c) 索引值(index):位於選擇子的高13位,表明需要訪問的段在描述附表中的位置。

在虛擬模式下,段暫存器存放選擇子。可以用顯示的mov指令來賦值,也可以用jmp或者call來給cs賦值。另外如果每次cpu都取得索引值去描述附表中去查詢段位址(描述附表存放在記憶體中)效率會非常低下,為了提高效率。cpu設計了段快取記憶體,來降低對記憶體的訪問次數。每個段暫存器分為可見部分和不可見部分,可見部分為16位,程式設計師可見。不可見部分用來存放描述符內容(段描述資訊),該部分對程式設計師不可見,只對cpu可見。結構如下:

圖4 段暫存器

當對可見部分賦值的時候,cpu後台用描述符表中對應的資訊初始化不可見部分。以後cpu就通過訪問不見部分來訪問段,這樣可以大大降低記憶體訪問的次數。

2)描述符和描述附表

描述符

用來描述段的詳細資訊,其結構如下:

圖5 描述表的基本結構

圖6 提交位為0時,描述符情況

f)描述符許可權級別(dpl):表明描述符訪問的許可權級別,被cpu用來進行許可權訪問控制,進行系統保護。

g)描述符型別(s):如果是系統描述符(ldt,tss等資料段)則置為1;如果為資料段或者**段則置為0。

h)型別(type):根據描述符不同,定義各不相同。有興趣各位可以參考intel手冊。

描述符表

描述表就是存放描述符的線性表,表中最多可以存放8k(2^13)個描述符,因為選擇子索引值一共13位,所以只能索引到2^13個描述符。

一共存在兩種描述符表,全域性描述符表(gdt)和本地描述符表(ldt),以選擇子的ti來表明,為哪乙個表的選擇子。

圖7 全域性描述附表和本地描述符表

每個系統必須有1個全域性描述符表,所有的任務和程式共享全域性描述符表。本地描述符表是可選的,系統中可以有乙個或者多個ldt,也可以沒有。比如設計為每個任務有乙個自己的ldt表,也可以讓多個任務共享同乙個ldt。ldt也是乙個段,也會在gdt中定義。

全域性描述符表不是段,但是他存在於線性位址中。全域性描述符表的線性位址存放在gdtr暫存器中,該暫存器開機就會被初始化。全域性描述符的第乙個選項不能用,錶用為null,可以給段暫存器賦值,一訪問就會報異常。

段轉換總結

程式設計師給段暫存器賦值描述符選擇子,cpu通過選擇子找到段的基位址,然後加上偏移位址得出線性位址。

(未完待續)

80386保護模式儲存器定址(1)

邏輯位址 logical address 包含在機器語言指令中用來指定乙個運算元或一條指令的位址。每乙個邏輯位址都由乙個段和乙個偏移量組成,偏移量指明了從段的開始到實際位址之間的距離。線性位址 linear address 是乙個 32位無符號整數,可以用來表示高達 4gb的位址。實體地址 p hy...

記憶體管理(1)

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區 常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

記憶體管理(1)

記憶體管理 如果對乙個物件使用了alloc,mutable copy withzone 或者retain,那麼你必須使用相應的release或者autorelease。基本型別 任何c的型別 如 int,long,long long,struct等。記憶體管理對於c語言基本型別無效。oc型別 非基本...