計算機原理中的GDT與LDT

2021-09-06 10:16:43 字數 3227 閱讀 3803

保護模式下的段暫存器 由 16位的選擇器 與 64位的段描述符暫存器 構成

段描述符暫存器: 儲存段描述符

選擇器:儲存段描述符的索引

ps:原先實模式下的各個段暫存器作為保護模式下的段選擇器,80486中有6個(即cs,ss,ds,es,fs,gs)80位的段暫存器,同時提供6個段左右機器當前執行的位址空間。由選擇器cs對應表示的段仍為**段,選擇器ss對應表示的段仍為堆疊段

(1)全域性描述符表gdt(global descriptor table)在整個系統中,全域性描述符表gdt只有一張(乙個處理器對應乙個gdt),gdt可以被放在記憶體的任何位置,但cpu必須知道gdt的入口,也就是基位址放在**,intel的設計者門提供了乙個暫存器gdtr用來存放gdt的入口位址,程式設計師將gdt設定在記憶體中某個位置之後,可以通過lgdt指令將gdt的入口位址裝入此積存器,從此以後,cpu就根據此暫存器中的內容作為gdt的入口來訪問gdt了。gdtr中存放的是gdt在記憶體中的基位址和其表長界限。

(2)段選擇子(selector)由gdtr訪問全域性描述符表是通過「段選擇子」(實模式下的段暫存器)來完成的,如圖三①步。段選擇子是乙個16位的暫存器(同實模式下的段暫存器相同)如圖四

段選擇子包括三部分:描述符索引(index)、ti、請求特權級(rpl)。他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由這個位置再根據在gdtr中儲存的描述符表基址就可以找到相應的描述符(如圖三①步)。然後用描述符表中的段基址加上邏輯位址(sel:offset)的offset就可以轉換成線性位址(如圖三②步),段選擇子中的ti值只有一位0或1,0代表選擇子是在gdt選擇,1代表選擇子是在ldt選擇。請求特權級(rpl)則代表選擇子的特權級,共有4個特權級(0級、1級、2級、3級)。

關於特權級的說明:任務中的每乙個段都有乙個特定的級別。每當乙個程式試圖訪問某乙個段時,就將該程式所擁有的特權級與要訪問的特權級進行比較,以決定能否訪問該段。系統約定,cpu只能訪問同一特權級或級別較低特權級的段。

(3)區域性描述符表ldt(local descriptor table)區域性描述符表可以有若干張,每個任務可以有一張。我們可以這樣理解gdt和ldt:gdt為一級描述符表,ldt為二級描述符表。如圖

ldt和gdt從本質上說是相同的,只是ldt巢狀在gdt之中。ldtr記錄區域性描述符表的起始位置,與gdtr不同ldtr的內容是乙個段選擇子。由於ldt本身同樣是一段記憶體,也是乙個段,所以它也有個描述符描述它,這個描述符就儲存在gdt中,對應這個表述符也會有乙個選擇子,ldtr裝載的就是這樣乙個選擇子。ldtr可以在程式中隨時改變,通過使用lldt指令。如上圖,如果裝載的是selector 2則ldtr指向的是表ldt2。舉個例子:如果我們想在表ldt2中選擇第三個描述符所描述的段的位址12345678h。

1. 首先需要裝載ldtr使它指向ldt2 使用指令lldt將select2裝載到ldtr

2. 通過邏輯位址(sel:offset)訪問時sel的index=3代表選擇第三個描述符;ti=1代表選擇子是在ldt選擇,此時ldtr指向的是ldt2,所以是在ldt2中選擇,此時的sel值為1ch(二進位制為11 1 00b)。offset=12345678h。邏輯位址為1c:12345678h

3. 由sel選擇出描述符,由描述符中的基址(base)加上offset可得到線性位址,例如基址是11111111h,則線性位址=11111111h+12345678h=23456789h

4. 此時若再想訪問ldt1中的第三個描述符,只要使用lldt指令將選擇子selector 1裝入再執行2、3兩步就可以了(因為此時ldtr又指向了ldt1)

由於每個程序都有自己的一套程式段、資料段、堆疊段,有了區域性描述符表則可以將每個程序的程式段、資料段、堆疊段封裝在一起,只要改變ldtr就可以實現對不同程序的段進行訪問。

-----------------------------------------------我是分割線------------------------

段描述符

p,present位,1表示所描述的段存在(有效),為0表示所描述的段無效,使用該描述符會引起異常

dpl,descriptor privilege,描述符特權級別,說明所描述段的特權級別 

dt,描述符型別位,1說明當前描述符為儲存段描述符,0為系統描述符或門描述符.

type:

位0:a(accessed)位,表明描述符是否已被訪問;把選擇子裝入段暫存器時,該位被標記為1

位3:e(executable?)位,0說明所描述段為資料段;1為可執行段(**段)

當為資料段時,

位1為w位,說明該資料段是否可寫(0唯讀,1可寫)

位2為ed位,說明該段的擴充套件方向(0向高位擴充套件,1向低位擴充套件)

當為可執行段是,

位1為r位,說明該執行段是否可讀(0只執行,1可讀)

位2為c位,0說明該段不是一致碼段(普通**段),1為一致碼段

g為粒度位,0說明limit粒度為位元組,1為4k位元組.

d位:

1.在可執行段中,d為1,表示使用32位位址,32/8位運算元;為0表示使用16位位址,16/8位運算元

2.在由ss定址的段描述符(堆疊段?)中,d為1表示隱含操作(如push/pop)使用esp為堆疊指標,/

為0使用sp(隱含操作:未明確定義段屬性型別use16/use32?66h,67h?)

3.在向低擴充套件的儲存段中,d為1,表示段的上限為4g;為0上限為64k

儲存段描述符的結構表示:

分段管理可以把虛擬位址轉換成線性位址,而分頁管理可以進一步將線性位址轉換成實體地址。當cr0中的pg位置1時,啟動分頁管理功能,為0時,這禁止啟動分頁管理功能,並且把線性位址作實體地址使用。

線性位址= 段基指 + 偏移位址

32位線性位址轉為實體地址:

32位分為:

頁目錄索引:佔最高10位,指示頁目錄表中第幾個頁表描述符

頁表索引:佔12位到21位,也是10位。指示這頁表中第幾個頁描述符

GDT與LDT的關係

gdt是個裝系統xx描述符的容器 xx可以是 段 資料段 tss段 ldt段等 其在記憶體中是一片連續的記憶體,以8位元組分隔開,邏輯上稱為儲存系統描述符的資料結構。ldt也是乙個裝xx描述符的容器 xx通常為某個任務的資料段 段 亂七八糟段 不同於gdt的是,ldt在記憶體中為乙個 段 既然是 段...

計算機原理

關於 深入理解計算機系統 老趙的這一番話,深深的觸動了我,確實,這本書用怎麼說呢,並不是深入,而是涉及的知識比較廣,但又都是廣大程式猿不得不知道的知識,下面我們就來慢慢品嚐這本書吧。工作之餘,學習學習,總是好的。言歸正傳,接下來,享讀 computer systems a programmer s ...

計算機原理

計算機 實質是資料儲存和資料流動 資料是儲存在磁碟上的,磁碟是由磁顆粒點組成,磁顆粒點可以帶電,帶電是1,不帶電是0,磁碟上有保護膜,不直接與空氣接觸,乙個磁顆粒點就是1bit,1b 8bit,資料傳輸就是傳輸電平 1t 8 9萬億顆粒點 對顆粒點需要管理,機械盤內部有很多光碟,顆粒點在光碟的正反兩...