GDT、LDT、GDTR、LDTR、段寄存器一圖流


段描述符表

段描述符表簡稱描述符表,用來存儲保護方式下段描述符的一個陣列。80386/80486 CPU 共有3 種描述符表:全局描述符表GDT、局部描述符表LDT 和中斷描述符表IDT。描述符表由描述符順序排列組成,占一定的內存,由系統地址寄存器(GDTR 、LDTR、IDTR) 指示其在物理存儲器中的位置和大小。

全局描述符表GDT 是供所有任務使用的描述符表,在物理存儲器地址空間中定義全局描述符表GDT。通常操作系統使用的有代碼段描述符、數據段描述符、調用門描述符、各個任務的LDT 描述符、任務狀態段TSS 描述符、任務門描述符等。

局部描述符表LDT 是每一項任務運行時都要使用的描述符表。在多任務操作系統管理下,每個任務通常包含兩部分:與其他任務共用的部分及本任務獨有的部分。與其他任務共用部分的段描述符存儲在全局描述符表GDT內;本任務獨有部分的段描述符存儲在本任務的局部描述符表LDT 內。這樣,每個任務都有一個局部描述符表LDT,而每個LDT 表又是一個段,它也就必須有一個對應的LDT 描述符。該LDT 描述符存儲在全局描述符表中。局部描述符表LDT 中所存儲的屬於本任務的段描述符通常有代碼段描述符、數據段描述符、調用門描述符及任務門描述符等。

GDT 和LDT 段描述符表實際上是段描述符的一個長度不定的數據陣列,如圖8.5 所示。描述符表在長度上是可變的,最多容納213 個描述符,最少包含一個描述符。每個項有8 個字節長,稱為一個段描述符。中斷描述符表IDT暫不介紹。

段寄存器(中的TI)、GDT、LDT、GDTR、LDTR關系:

 

1.4 段選擇符  

段描述符表(GDT、LDT)是通過選擇符來索引的,IDT不用通過選擇符,直接用中斷號索引。

保護模式下段寄存器存放的都是段選擇符。  

選擇符一共16位,格式如下:

 

Index一共13位,正好可以索引到GDT或者LDT的最大限長。由於描述符表都是8直接對齊的,所以吧index放在高13位,這樣把低3位屏蔽后就可以得到表內 偏移地址。

TI(Table Indicator)位是引用描述符表指示位,TI=0指示從全局描述符表GDT中讀取描述符;TI=1指示從局部描述符表LDT中讀取描述符。

選擇子的最低兩位是請求特權級RPL(Requested Privilege Level),用於特權檢查。CS和SS寄存器中的RPL就是CPL(current privilege level當前特權級)Linux下使用0、3兩個別人是內核態、用戶態 

1.5 段寄存器 
80386的段寄存器都包含有一個16位可見部分和一個不可見部分。段寄存器的可見部分由程序來操作,就好像是簡單的16位寄存器,存放16位的段選擇符。不可見部分由CPU維護,作為高速緩沖。每當段選擇符被加載到段寄存器中時,CPU取得段描述符表中相應的描述符,然后把段的屬性放入不可見部分中。比如段基地址,限長,以及其他屬性。這樣避免每次訪問內存。

 

 

 

 段選擇符中TI位為1時的情況,這時從LDT中讀取段描述符。需要先從GDT中讀取LDT段描述符,然后再從LDT中讀取段基地址。(所以系統要先預設GDTR和LDTR的地址)

 

2.多任務 
 上面介紹了存儲段和LDT段,這里介紹另外一個系統段任務狀態段TSS。  為了提供多任務,80386使用了特殊的數據結構,主要有任務狀態段TSS(Task State Segmeng)和任務寄存器TR

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM