GDT、GDTR、LDT、LDTR的理解
GDT是全局描述附表,主要存放操作系統和各任務公用的描述符,如公用的數據和代碼段描述符、各任務的TSS描述符和LDT描述符。(TSS是任務狀態段,存放各個任務私有運行狀態信息描述符)
LDT是局部描述符表,主要存放各個任務的私有描述符,如本任務的代碼段描述符和數據段描述符等。
GDTR是一個長度為48bit的寄存器,內容為一個32位的基地址和一個16位的段限。其中32位的基址是指GDT在內存中的地址。
LDTR是局部描述符寄存器,由一個可見的16位寄存器(段選擇子)和一個不可見的描述符寄存器組成(描述符寄存器實際上是一個不可見的高速緩沖區)。
這里加入我的理解:應為GDT中除了有段描述符之外還有LDT描述符,所以微處理器在GDT中尋址LDT時,也需要使用選擇子,以保持與段描述符尋址的統一。
在這里還要引入一個段選擇子的概念。段選擇子是一個寄存器,高13位用來指示描述符在描述符表中的索引號,低兩位是表示使用描述符的特權級別;另外一位(T1)是GDT和LDT的信號量,如果T1=0,則使用GDTR,如果T1=1,則使用LDTR。選擇子將被裝入段寄存器中。系統中的段寄存器共有六個:CS、SS、DS、ES、FS和GS。當選擇子被裝入段寄存器時,微處理器會自動將其對應的描述符裝入描述符寄存器。
系統任務切換時,LDT切換,而GDT不切換(因為真個系統只有一個GDT),這時新任務的LDT描述符的選擇子就被裝入到LDTR中。
任務切換過程中,各個相關寄存器的變化?
當 任務切換時,如果使用的是LDT,首先變化的是LDTR。段選擇子被裝入LDTR,同時LDT描述符自動被裝入描述符寄存器。系統利用LDTR中的段選擇 子來定位LDT描述符在GDT中的位置。這里我不明白的是LDTR中的LDT描述符和GDT中的描述符是什么關系?為什么要這樣做呢?自動裝入到LDTR 中的描述符到底是什么?從哪來?請高手指點!
為什么要有一個GDTR,并且GDTR的結構和LDTR不一樣呢?
這主要是因為系統只有一個GDT,而GDT的描述符有不能存放在GDT中(LDT的描述符都存放在GDT中),所以就需要一個GDTR來指示GDT在內存中的位置。因為GDTR是直接指示內存地址,而LDTR主要指示LDT描述符在GDT中的位置和屬性,所以GDTR和LDTR的結構也不同。
?
版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://xmurobin.blogbus.com/logs/11842842.html
------------------------- 以下來自他處-----------------------------------------------------------------------
GDTR和LDTR如何把虛擬地址轉換線性地址
GDTR是一個48位寄存器,指向全局描述符表GDT,從16位到47位前32位表示GDT在內存中的地址,是線性地址,需要通過頁表轉換成物理地址
LDTR是一個16位寄存器,是在GDT中的索引,指向局部描述符表LDT,每個任務有一個LDT,不同的LDT占用不同的內存段,由不同的系統描述符描述,這些系統描述符放在GDT中.
LDTR里面保存的是索引值,指向LDT在GDT中的位置
如果手頭上有虛擬地址xxxx:yyyyyyyy
首先從GDTR中取出GDT的基址BA找到GDT
xxxx一共16位,根據倒數第三位即T1位判斷
如果T1=0,xxxx的前13位表示的是GDT的位置索引,根據索引得到一個描述符
該描述符含有段的基址與其他各種信息,段的起始地址+yyyyyyyyy就得到線程地址
如果T1=1,那么從LDTR得到LDT的位置索引,在GDT里面找到LDT描述符,LDT描述符里面包含LDT的線性地址
找到LDT,取出xxxx的前13位,在LDT中找到段描述符,該段描述符里面包含段的基址等信息.
而后段的基址加上yyyyyyyy得到線性地址
總結
以上是生活随笔為你收集整理的GDT、GDTR、LDT、LDTR的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言time_t转oletime,Da
- 下一篇: 如何提取明细表头_如何在实际操作中应用偏