GDT(全局描述符表)和LDT(局部描述符表)
每個程序都有自己的LDT,但是同一臺計算機上的所有程序共享一個GDT。LDT描述局部于每個程序的段,包括其代碼、數(shù)據(jù)、堆棧等。GDT描述系統(tǒng)段,包括操作系統(tǒng)本身。
①全局描述符表GDT(Global Descriptor Table)在整個系統(tǒng)中,全局描述符表GDT只有一張(一個處理器對應(yīng)一個GDT),GDT可以被放在內(nèi)存的任何位置,但CPU必須知道GDT的入口,也就是基地址放在哪里,Intel的設(shè)計者門提供了一個寄存器GDTR用來存放GDT的入口地址,程序員將GDT設(shè)定在內(nèi)存中某個位置之后,可以通過LGDT指令將GDT的入口地址裝入此積存器,從此以后,CPU就根據(jù)此寄存器中的內(nèi)容作為GDT的入口來訪問GDT了。GDTR中存放的是GDT在內(nèi)存中的基地址和其表長界限。
②段選擇子(Selector)由GDTR訪問全局描述符表是通過“段選擇子”(實模式下的段寄存器)來完成的。為了訪問一個段,一個Pentium程序必須把這個段的選擇子裝入機器的6個段寄存器的某一個中。在運行過程中,CS寄存器保存代碼段的選擇子,DS寄存器保存數(shù)據(jù)段的選擇子。每個選擇子是一個16位數(shù)。
選擇子中的一位指出這個段是局部的還是全局的(它是在LDT中還是在GDT中),其他的13位索引是LDT或GDT的表項編號,表示所需要的段的描述符在描述符表的位置,由這個位置再根據(jù)在GDTR中存儲的描述符表基址就可以找到相應(yīng)的描述符,然后用描述符表中的段基址加上邏輯地址(SEL:OFFSET)的OFFSET就可以轉(zhuǎn)換成線性地址。因此,這些表的長度被限制在最多容納8K個段描述符。
段選擇子中的TI值只有一位0或1,0代表選擇子是在GDT選擇,1代表選擇子是在LDT選擇。請求特權(quán)級(RPL)則代表選擇子的特權(quán)級,共有4個特權(quán)級(0級、1級、2級、3級)。任務(wù)中的每一個段都有一個特定的級別。每當一個程序試圖訪問某一個段時,就將該程序所擁有的特權(quán)級與要訪問的特權(quán)級進行比較,以決定能否訪問該段。系統(tǒng)約定,CPU只能訪問同一特權(quán)級或級別較低特權(quán)級的段。
例如給出邏輯地址:21h:12345678h轉(zhuǎn)換為線性地址
a. 選擇子SEL=21h=0000000000100 0 01b 他代表的意思是:選擇子的index=4即100b選擇GDT中的第4個描述符;TI=0代表選擇子是在GDT選擇;左后的01b代表特權(quán)級RPL=1
b. OFFSET=12345678h若此時GDT第四個描述符中描述的段基址(Base)為11111111h,則線性地址=11111111h+12345678h=23456789h
③局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干張,每個任務(wù)可以有一張。我們可以這樣理解GDT和LDT:GDT為一級描述符表,LDT為二級描述符表。如圖
LDT和GDT從本質(zhì)上說是相同的,只是LDT嵌套在GDT之中。LDTR記錄局部描述符表的起始位置,與GDTR不同LDTR的內(nèi)容是一個段選擇子。由于LDT本身同樣是一段內(nèi)存,也是一個段,所以它也有個描述符描述它,這個描述符就存儲在GDT中,對應(yīng)這個表述符也會有一個選擇子,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裝入再執(zhí)行2、3兩步就可以了(因為此時LDTR又指向了LDT1)
由于每個進程都有自己的一套程序段、數(shù)據(jù)段、堆棧段,有了局部描述符表則可以將每個進程的程序段、數(shù)據(jù)段、堆棧段封裝在一起,只要改變LDTR就可以實現(xiàn)對不同進程的段進行訪問。
段描述符:
P,present位,1表示所描述的段存在(有效),為0表示所描述的段無效,使用該描述符會引起異常?
DPL,Descriptor privilege,描述符特權(quán)級別,說明所描述段的特權(quán)級別?
DT,描述符類型位,1說明當前描述符為存儲段描述符,0為系統(tǒng)描述符或門描述符.?
TYPE:?
位0:A(accessed)位,表明描述符是否已被訪問;把選擇子裝入段寄存器時,該位被標記為1?
位3:E(EXECUTABLE?)位,0說明所描述段為數(shù)據(jù)段;1為可執(zhí)行段(代碼段)
當為數(shù)據(jù)段時,?
?? 位1為W位,說明該數(shù)據(jù)段是否可寫(0只讀,1可寫)?
?? 位2為ED位,說明該段的擴展方向(0向高位擴展,1向低位擴展)?
當為可執(zhí)行段是,?
?? 位1為R位,說明該執(zhí)行段是否可讀(0只執(zhí)行,1可讀)?
?? 位2為C位,0說明該段不是一致碼段(普通代碼段),1為一致碼段?
G為粒度位,0說明LIMIT粒度為字節(jié),1為4K字節(jié).?
D位:?
?? 1.在可執(zhí)行段中,D為1,表示使用32位地址,32/8位操作數(shù);為0表示使用16位地址,16/8位操作數(shù)?
?? 2.在由SS尋址的段描述符(堆棧段?)中,D為1表示隱含操作(如PUSH/POP)使用ESP為堆棧指針,
???? 為0使用SP(隱含操作:未明確定義段屬性類型USE16/USE32?66H,67H?)?
?? 3.在向低擴展的存儲段中,D為1,表示段的上限為4G;為0上限為64K
存儲段描述符的結(jié)構(gòu)表示:
分段管理可以把虛擬地址轉(zhuǎn)換成線性地址,而分頁管理可以進一步將線性地址轉(zhuǎn)換成物理地址。當CR0中的PG位置1時,啟動分頁管理功能,為0時,這禁止啟動分頁管理功能,并且把線性地址作物理地址使用。
虛擬地址轉(zhuǎn)為線性地址:
線性地址= 段基指 + 偏移地址
32位線性地址轉(zhuǎn)為物理地址:
32位分為:
頁目錄索引:占最高10位,指示頁目錄表中第幾個頁表描述符
頁表索引:占12位到21位,也是10位。指示這頁表中第幾個頁描述符
頁描述符:線性地址的低12位為頁內(nèi)偏移量。
三、實例(對理解非常有用)
1:訪問GDT
段描述符在GDT中
當TI=0時表示段描述符在GDT中,如上圖所示:
①先從GDTR寄存器中獲得GDT基址。
②然后再GDT中以段選擇器高13位位置索引值得到段描述符。
③段描述符符包含段的基址、限長、優(yōu)先級等各種屬性,這就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最后的線性地址。
2:訪問LDT
段描述符在LDT中
當TI=1時表示段描述符在LDT中,如上圖所示:
①還是先從GDTR寄存器中獲得GDT基址。
②從LDTR寄存器中獲取LDT所在段的位置索引(LDTR高13位)。
③以這個位置索引在GDT中得到LDT段描述符從而得到LDT段基址。
④用段選擇器高13位位置索引值從LDT段中得到段描述符。
⑤段描述符符包含段的基址、限長、優(yōu)先級等各種屬性,這就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最后的線性地址。
擴展
除了GDTR、LDTR外還有IDTR和TR
(1)中斷描述符表寄存器IDTR?
與GDTR的作用類似,IDTR寄存器用于存放中斷描述符表IDT的32位線性基地址和16位表長度值。指令LIDT和SIDT分別用于加載和保存IDTR寄存器的內(nèi)容。在機器剛加電或處理器復(fù)位后,基地址被默認地設(shè)置為0,而長度值被設(shè)置成0xFFFF。
(2)任務(wù)寄存器TR
TR用于尋址一個特殊的任務(wù)狀態(tài)段(Task?State?Segment,TSS)。TSS中包含著當前執(zhí)行任務(wù)的重要信息。
TR寄存器用于存放當前任務(wù)TSS段的16位段選擇符、32位基地址、16位段長度和描述符屬性值。它引用GDT表中的一個TSS類型的描述符。指令LTR和STR分別用于加載和保存TR寄存器的段選擇符部分。當使用LTR指令把選擇符加載進任務(wù)寄存器時,TSS描述符中的段基地址、段限長度以及描述符屬性會被自動加載到任務(wù)寄存器中。當執(zhí)行任務(wù)切換時,處理器會把新任務(wù)的TSS的段選擇符和段描述符自動加載進任務(wù)寄存器TR中。
總結(jié)
以上是生活随笔為你收集整理的GDT(全局描述符表)和LDT(局部描述符表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A20 地址线问题
- 下一篇: 串行 spi Flash 跨页编程的注意