每一個程序都有本身的LDT,可是同一臺計算機上的全部程序共享一個GDT。LDT描述局部於每一個程序的段,包括其代碼、數據、堆棧等。GDT描述系統段,包括操做系統自己。html
①全局描述符表GDT(Global Descriptor Table)在整個系統中,全局描述符表GDT只有一張(一個處理器對應一個GDT),GDT能夠被放在內存的任何位置,但CPU必須知道GDT的入口,也就是基地址放在哪裏,Intel的設計者門提供了一個寄存器GDTR用來存放GDT的入口地址,程序員將GDT設定在內存中某個位置以後,能夠經過LGDT指令將GDT的入口地址裝入此積存器,今後之後,CPU就根據此寄存器中的內容做爲GDT的入口來訪問GDT了。GDTR中存放的是GDT在內存中的基地址和其表長界限。程序員
②段選擇子(Selector)由GDTR訪問全局描述符表是經過「段選擇子」(實模式下的段寄存器)來完成的。爲了訪問一個段,一個Pentium程序必須把這個段的選擇子裝入機器的6個段寄存器的某一箇中。在運行過程當中,CS寄存器保存代碼段的選擇子,DS寄存器保存數據段的選擇子。每一個選擇子是一個16位數。ide
選擇子中的一位指出這個段是局部的仍是全局的(它是在LDT中仍是在GDT中),其餘的13位索引是LDT或GDT的表項編號,表示所須要的段的描述符在描述符表的位置,由這個位置再根據在GDTR中存儲的描述符表基址就能夠找到相應的描述符,而後用描述符表中的段基址加上邏輯地址(SEL:OFFSET)的OFFSET就能夠轉換成線性地址。所以,這些表的長度被限制在最多容納8K個段描述符。操作系統
段選擇子中的TI值只有一位0或1,0表明選擇子是在GDT選擇,1表明選擇子是在LDT選擇。請求特權級(RPL)則表明選擇子的特權級,共有4個特權級(0級、1級、2級、3級)。任務中的每個段都有一個特定的級別。每當一個程序試圖訪問某一個段時,就將該程序所擁有的特權級與要訪問的特權級進行比較,以決定可否訪問該段。系統約定,CPU只能訪問同一特權級或級別較低特權級的段。設計
例如給出邏輯地址:21h:12345678h轉換爲線性地址
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指針
③局部描述符表LDT(Local Descriptor Table)局部描述符表能夠有若干張,每一個任務能夠有一張。咱們能夠這樣理解GDT和LDT:GDT爲一級描述符表,LDT爲二級描述符表。如圖htm
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裝入再執行二、3兩步就能夠了(由於此時LDTR又指向了LDT1)
因爲每一個進程都有本身的一套程序段、數據段、堆棧段,有了局部描述符表則能夠將每一個進程的程序段、數據段、堆棧段封裝在一塊兒,只要改變LDTR就能夠實現對不一樣進程的段進行訪問。blog
段描述符:索引
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位。指示這頁表中第幾個頁描述符
頁描述符:線性地址的低12位爲頁內偏移量。