在前面的課程學習中我們了解到,段暫存器有96位,其中80位不可見,包括base,limit,attribute。16位可見,即段選擇子selector。
對段暫存器進行寫入時,cpu根據段選擇子到gdt表中尋找段描述符,段描述符共8位元組,64位,cpu根據段描述符填充段暫存器。
那麼問題就是,如何用64位的段描述符來填充80位的段暫存器呢?為了解決該問題,我們需要學習段描述符的p,g位。
段描述符結構
段暫存器結構
這個位比較簡單,當p=1時,段描述符有效;當p=0時,段描述符無效。
由於intel考慮向前相容,我們會發現段描述符的結構比較混亂,東一塊西一塊的。attribute在段描述符高4位元組的8-23位,base在段描述符的低4位元組的16-31位,高4位元組的0-7位和24-31位。上述兩個屬性沒有資料丟失,段暫存器和段描述符內的位數是一樣多的。而limit在段暫存器內佔32位,在段描述符內只有20位。
當g=0時,limit的範圍是0x00000000-0x000fffff,其中,段描述符的20位在低位,高位補0.
當g=1時,limit的範圍是0x00000fff-0xffffffff,其中,段描述符的20位在高位,低位補f。
給出下列5個段選擇子,從gtd表中查詢對應的段描述符,然後填充到段暫存器中。
3、將段描述符填寫到段暫存器結構體中(段選擇子:23 2b 30 3b 53)
2300100 0 11
index:4
00cff300`0000ffff
word selector: 23
word atrribute: cff3
dword base: 00000000
dword limit: ffffffff
2b00101 0 11
index:5
80008b04`200020ab
word selector: 2b
word atrribute: 008b
dword base: 80042000
dword limit:000020ab
3000110 0 00
index:6
ffc093df`f0000001
word selector: 30
word atrribute: c093
dword base: ffdff000
dword limit: 00001fff
3b00111 0 11
index:7
0040f300`00000fff
word selector: 3b
word atrribute: 40f3
dword base: 00000000
dword limit: 00000fff
5301010 0 11
index:a
80008954`af000068
word selector: 53
word atrribute: 0089
dword base: 8054af00
dword limit: 00000068
段描述符屬性DB位,段許可權檢查
描述符屬性 db位 情況一 對cs段的影響 d 1 採用32位定址方式 d 0 採用16位定址方式 字首67 改變定址方式 情況二 對ss段的影響 d 1 隱式堆疊訪問指令 如 push pop call 使用32位堆疊指標暫存器esp d 0 隱式堆疊訪問指令 如 push pop call 使用...
段描述符屬性P位和G位
前言 段描述符屬性p位和g位筆記 自己在學習段描述符與段選擇子的時候有提出乙個問題,如下圖所示,這個問題老師在段描述符屬性p位和g位中提及 因為老師說段暫存器是有96位的,但是可以發現段描述符的64位再加上段選擇子16位,實際總共才是80位,那剩下的16位是從 來的呢?這裡再來看下段描述符的結構 首...
04 段描述符屬性P位與G位
在前面篇章裡我們知道,寫段暫存器是通過段選擇子查gdt表中段描述符來填充剩餘的80位,但是段描述符只有64位,這就涉及到怎麼填充的問題 下面重新貼出段描述符屬性結構,如下圖 這篇講的p位位於高四位元組的15位,g位位於高四位元組的23位 p位的作用 p位說明當前段描述符是否有效,p為1時說明段描述符...