前言:段描述符屬性p位和g位筆記
自己在學習段描述符與段選擇子的時候有提出乙個問題,如下圖所示,這個問題老師在段描述符屬性p位和g位中提及
因為老師說段暫存器是有96位的,但是可以發現段描述符的64位再加上段選擇子16位,實際總共才是80位,那剩下的16位是從**來的呢?
這裡再來看下段描述符的結構
首先來看attribute,段描述符裡面對應的高位元組第8-23位,一共16位。
繼續來看base,在段描述符裡面分為三個部分,位於段描述符中的高位元組24:31,高位元組第7:0,低位元組第31:16,一共32位。
還有limit,段描述符裡面由兩部分組成,高位元組16-19,低位元組0-15,這裡一共20位。
以上一共就有了16(selector)+16(attribute)+32(base)+20(limit) = 84,還剩下12位,問題其實存在於這個limit中多出來的三位,這裡繼續來看limit結構
這裡好像就有點矛盾了,老師最一開始講說limit是00000000-ffffffff的,但是這裡說的話看起來就只有00000-fffff,如果把這個加上去應該正好是96位了
這個limit可以看到有20位,那麼轉成16進製制也就00000-fffff,那麼另外3個十六進製制000-fff去哪了?
這個limit剩餘的12位就是由其中的g位來進行決定
如果g位為0的話,那麼段描述符中的limit高12位就填充三個000,那麼最大上限就是000fffff
如果g位為1的話,那麼段描述符中的limit低12位就填充三個fff,那麼最大上限就是ffffffff
這裡又可以重新看下相關的段暫存器中的limit,可以看到都是ffffffff,那麼我們就可以說這些暫存器載入的段描述符中的g為則為1
總結下:段描述符原本只有64位,它是如何變成96位的?
其實可以發現其中就是通過復用了部分其中的位,最後成了96位,然後這裡的limit結構體還需要理解下,其中的高3個十六進製制和低3個十六進製制是根據段描述符中的g位來進行決定的!
這裡學習段描述符p位和g位,下面先放一張關於段描述符結構體的圖
p位位於高位元組的第15位
當p位為1的話,那麼表示當前的段描述符則有效
當p位為0的話,那麼表示當前的段描述符則無效
g位位於高位元組的第23位
這裡的g位有什麼用?根據老師所講的我目前知道的g位則跟段描述符中的limit有關係
如果g位為0的話,那麼段描述符中的limit高12位就填充三個000,那麼就是0x00000000-0x000fffff
如果g位為1的話,那麼段描述符中的limit低12位就填充三個fff,那麼就是0x00000fff-0xffffffff
p位在高位元組的第15位
g位在高位元組的第23位
這裡比如分析下0x2b
selector部分
0x2b -> 0000 0000 0010 1011 -> rpl:3 ti:0 index:5
kd> dq 8003f000
8003f000 00000000 00000000 00cf9b00 0000ffff
8003f010 00cf9300 0000ffff 00cffb00 0000ffff
8003f020 00cff300 0000ffff 80008b04 200020ab
8003f030 ffc093df f0000001 0040f300 00000fff
8003f040 0000f200 0400ffff 00000000 00000000
8003f050 80008954 9f000068 80008954 9f680068
8003f060 00009302 2f40ffff 0000920b 80003fff
8003f070 ff0092ff 700003ff 80009a40 0000ffff
索引為5的-> 80008b04 200020ab
段選擇子 -> 2b
分析:2b -> 0000 0000 0010 1011
rpl: 3
ti: 0
index:5
base: 80042000
attribute:008b
limit: b20ab g: 0
04 段描述符屬性P位與G位
在前面篇章裡我們知道,寫段暫存器是通過段選擇子查gdt表中段描述符來填充剩餘的80位,但是段描述符只有64位,這就涉及到怎麼填充的問題 下面重新貼出段描述符屬性結構,如下圖 這篇講的p位位於高四位元組的15位,g位位於高四位元組的23位 p位的作用 p位說明當前段描述符是否有效,p為1時說明段描述符...
段描述符屬性DB位,段許可權檢查
描述符屬性 db位 情況一 對cs段的影響 d 1 採用32位定址方式 d 0 採用16位定址方式 字首67 改變定址方式 情況二 對ss段的影響 d 1 隱式堆疊訪問指令 如 push pop call 使用32位堆疊指標暫存器esp d 0 隱式堆疊訪問指令 如 push pop call 使用...
(4)段描述符P,G位
在前面的課程學習中我們了解到,段暫存器有96位,其中80位不可見,包括base,limit,attribute。16位可見,即段選擇子selector。對段暫存器進行寫入時,cpu根據段選擇子到gdt表中尋找段描述符,段描述符共8位元組,64位,cpu根據段描述符填充段暫存器。那麼問題就是,如何用6...