04 段描述符屬性P位與G位

2021-09-09 07:39:42 字數 1710 閱讀 6247

在前面篇章裡我們知道,寫段暫存器是通過段選擇子查gdt表中段描述符來填充剩餘的80位,但是段描述符只有64位,這就涉及到怎麼填充的問題;

下面重新貼出段描述符屬性結構,如下圖:

這篇講的p位位於高四位元組的15位,g位位於高四位元組的23位;

p位的作用:p位說明當前段描述符是否有效,p為1時說明段描述符是有效的;

p位為0時說明當前段描述符是無效的。我們通過指令將乙個段描述符載入到段暫存器時,cpu首先檢查p位是否有效,若有效則繼續後續操作;若無效則不進行後續操作。

下面我們再來回顧一下段暫存器的結構:

struct segmentregister;
段選擇子是我們給定的16位值,那後續80位則需要用段描述符來填充。

attribute:由段描述符的第8~23位來填充,剛好16位,無壓縮;

base:由三部分組成,第一部分為高四位元組的24~31位,第二部分為高四位元組的0到7位,第三部分為底四位元組的16到31位,由這三部分組成了四位元組的base位址。

limit:由兩部分組成,第一部分是高四位元組的第16到19位,第二部分是第四位元組的0到15位;這兩部份加起來是20位,而limit為32位,我們就還差12位,那麼為了補全這12位,我們就需要來了解一下段描述符中位於高四位元組中第23位的屬性位g位;如果g位為0則表示limit單位是位元組,所以當g位為0的時候段描述符中的20位填limit的底20位,高12位補0即可,當g位為1的時候,limit的單位是2的12次方也就是4kb而不再是位元組(有點類似ip報文中4位首部長度規定為位元組的思想),所以當g為1的時候段描述符的20位填limit高20位,其他12位補1;我們用od開啟乙個程式,就可以直觀的感受到limit的值,如下圖紅色小框中的0xffffffff

下面我們通過上篇跟本篇的知識來填乙個段選擇子為0x002b的段暫存器;

首先:我們將0x002b轉換為二進位制為0000 0000 0010 1011,從上篇我們知道段選擇子分三部分,第3位ti為說明查詢的是gdt表還是ldt表,這裡我們看到第三位為1,所以我們需要查gdt表,我們在windbg中用指令檢視gdtr的位址值如下圖:

接著我們用dq 8003f000查gdt表如下圖:

從上圖我們用2作為索引找到段描述符為:00cf9300`0000ffff

對應的高四位元組二進位制為:0000 0000 1100 1111 1001 0011 0000 0000

對應的底四位元組為:0000 0000 0000 0000 1111 1111 1111 1111

我們先來看一下高四位元組的第15位p位為1,說明這個段描述符是有效的。

通過段描述符的結構我們可以拆分出屬性attribute:0xcf93對應二進位制為:1100 1111 1001 0011

base:為0

我們看一下高四位元組的23位g位為1,說明limit單位為4kb,所以後面12位補1,則我們這裡的limit為:0xffffffff

段描述符屬性P位和G位

前言 段描述符屬性p位和g位筆記 自己在學習段描述符與段選擇子的時候有提出乙個問題,如下圖所示,這個問題老師在段描述符屬性p位和g位中提及 因為老師說段暫存器是有96位的,但是可以發現段描述符的64位再加上段選擇子16位,實際總共才是80位,那剩下的16位是從 來的呢?這裡再來看下段描述符的結構 首...

段描述符屬性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...