什麼是GDT,LDT,GDTR及LDTR?

2021-08-16 23:58:11 字數 3302 閱讀 3268

(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只能訪問同一特權級或級別較低特權級的段。

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

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

區域性描述符表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就可以實現對不同程序的段進行訪問。

當進行任務切換時,處理器會把新任務ldt的段選擇符和段描述符自動地載入進ldtr中。在機器加電或處理器復位後,段選擇符和基位址被預設地設定為0,而段長度被設定成0xffff。

三、例項(對理解非常有用)

1:訪問gdt

段描述符在gdt中

當ti=0時表示段描述符在gdt中,如上圖所示:

①先從gdtr暫存器中獲得gdt基址。

②然後再gdt中以段選擇器高13位位置索引值得到段描述符。

③段描述符符包含段的基址、限長、優先順序等各種屬性,這就得到了段的起始位址(基址),再以基址加上偏移位址yyyyyyyy才得到最後的線性位址。

2:訪問ldt

段描述符在ldt中

當ti=1時表示段描述符在ldt中,如上圖所示:

①還是先從gdtr暫存器中獲得gdt基址。

②從ldtr暫存器中獲取ldt所在段的位置索引(ldtr高13位)。

③以這個位置索引在gdt中得到ldt段描述符從而得到ldt段基址。

④用段選擇器高13位位置索引值從ldt段中得到段描述符。

⑤段描述符符包含段的基址、限長、優先順序等各種屬性,這就得到了段的起始位址(基址),再以基址加上偏移位址yyyyyyyy才得到最後的線性位址。

擴充套件除了gdtr、ldtr外還有idtr和tr

(1)中斷描述符表暫存器idtr 

與gdtr的作用類似,idtr暫存器用於存放中斷描述符表idt的32位線性基位址和16位表長度值。指令lidt和sidt分別用於載入和儲存idtr暫存器的內容。在機器剛加電或處理器復位後,基位址被預設地設定為0,而長度值被設定成0xffff。

(2)任務暫存器tr

tr用於定址乙個特殊的任務狀態段(task state segment,tss)。tss中包含著當前執行任務的重要資訊。

tr暫存器用於存放當前任務tss段的16位段選擇符、32位基位址、16位段長度和描述符屬性值。它引用gdt表中的乙個tss型別的描述符。指令ltr和str分別用於載入和儲存tr暫存器的段選擇符部分。當使用ltr指令把選擇符載入進任務暫存器時,tss描述符中的段基位址、段限長度以及描述符屬性會被自動載入到任務暫存器中。當執行任務切換時,處理器會把新任務的tss的段選擇符和段描述符自動載入進任務暫存器tr中。

原文:

什麼是GDT,LDT,GDTR及LDTR?

1 全域性描述符表gdt global descriptor table 在整個系統中,全域性描述符表gdt只有一張 乙個處理器對應乙個gdt gdt可以被放在記憶體的任何位置,但cpu必須知道gdt的入口,也就是基位址放在 intel的設計者門提供了乙個暫存器gdtr用來存放gdt的入口位址,程式...

什麼是CSS hack及寫法。

由於不同的瀏覽器,比如internet explorer 6,internet explorer 7,mozilla firefox等,對css的解析認識不一樣,因此會導致生成的頁面效果不一樣,得不到我們所需要的頁面效果。這個時候我們就需要針對不同的瀏覽器去寫不同的css,讓它能夠同時相容不同的瀏覽...

什麼是CSS hack及寫法。

什麼是css hack 由於不同的瀏覽器,比如internet explorer 6,internet explorer 7,mozilla firefox等,對css的解析認識不一樣,因此會導致生成的頁面效果不一樣,得不到我們所需要的頁面效果。這個時候我們就需要針對不同的瀏覽器去寫不同的css,讓...