保護模式下的段寄存器 由 16位的選取器 與 64位的段描述符寄存器 構成
段描述符寄存器: 儲存段描述符
選取器:儲存段描述符的索引
PS:原先實模式下的各個段寄存器作為保護模式下的段選取器,80486中有6個(即CS,SS,DS,ES,FS,GS)80位的段寄存器,同時提供6個段左右機器當前啟動並執行地址空間。由選取器CS對應表示的段仍為程式碼片段,選取器SS對應表示的段仍為堆棧段
(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只能訪問同一特權級或層級較低特權級的段。
例如給出邏輯地址: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
(3)局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干張,每個任務可以有一張。我們可以這樣理解GDT和LDT:GDT為一級描述符表,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就可以實現對不同進程的段進行訪問。
-----------------------------------------------我是分割線------------------------
段描述符:
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位為頁內位移量。