nasm下定義GDT結構

預備知識:
NASM中的位移運算符:"<<"表示左移和">>"表示右移。
注意這裏的位移總是無符號數(非負數)。並且位置時,左側總是用0填充,不會出現符號擴展。可以理解成彙編語言中的邏輯左移和邏輯右移。


定義如下:


 

; usage: Descriptor Base, Limit, Attr

;        Base:  dd (32 bits 段基址)

;        Limit: dd (low 20 bits available,20 bits 段界限)

;        Attr:  dw (lower 4 bits of higher byte are always 0)

%macro Descriptor 3

dw %2 & 0FFFFh ; 段界限1

dw %1 & 0FFFFh ; 段基址1

db (%1 >> 16) & 0FFh ; 段基址2

dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 屬性1 + 段界限2 + 屬性2

db (%1 >> 24) & 0FFh ; 段基址3

%endmacro ; 共 8 字節


;以上是全局描述符在nasm的宏定義

;在intel架構中,更準確的說是保護模式下,大部分內存管理和中斷服務例程都通過描述符表來控制。

;每個描述符存儲了CPU隨時可能需要獲取的一個單個對象(例如服務例程、任務、一段代碼或數據等)

;的信息。如果你試圖裝載一個數據到一個段寄存器中,CPU需要進行安全性和訪問控制檢查,來確認你

;是否獲得了訪問該內存區域的許可。一旦檢查結束,一些有用的信息(例如最低和最高地址)被緩存

;在CPU中的幾個不可見的寄存器中。

;intel定義了3種類型的描述符表:中斷描述符表(用以替換中斷向量表IVT)、全局描述符表和局部描述符表。

;每個表分別通過LIDT、LGDT、LLDT指令以(size, linear address)的形式定義


; 描述符圖示
 


; 說明:

;

; (1) P:    存在(Present)位。

; P=1 表示描述符對地址轉換是有效的,或者說該描述符所描述的段存在,即在內存中;

; P=0 表示描述符對地址轉換無效,即該段不存在。使用該描述符進行內存訪問時會引起異常。

;

; (2) DPL:  表示描述符特權級(Descriptor Privilege level),共2位。它規定了所描述段的特權級,用於特權檢查,以決定對該段能否訪問。 

;

; (3) S:   說明描述符的類型。

; 對於存儲段描述符而言,S=1,以區別與系統段描述符和門描述符(S=0)。 

;

; (4) TYPE: 說明存儲段描述符所描述的存儲段的具體屬性。

;

;  

; 數據段類型 類型值 說明

; ----------------------------------

; 0 只讀 

; 1 只讀、已訪問 

; 2 讀/寫 

; 3 讀/寫、已訪問 

; 4 只讀、向下擴展 

; 5 只讀、向下擴展、已訪問 

; 6 讀/寫、向下擴展 

; 7 讀/寫、向下擴展、已訪問 

;

;

; 類型值 說明

; 代碼段類型 ----------------------------------

; 8 只執行 

; 9 只執行、已訪問 

; A 執行/讀 

; B 執行/讀、已訪問 

; C 只執行、一致碼段 

; D 只執行、一致碼段、已訪問 

; E 執行/讀、一致碼段 

; F 執行/讀、一致碼段、已訪問 

;

;

; 系統段類型 類型編碼 說明

; ----------------------------------

; 0 <未定義>

; 1 可用286TSS

; 2 LDT

; 3 忙的286TSS

; 4 286調用門

; 5 任務門

; 6 286中斷門

; 7 286陷阱門

; 8 未定義

; 9 可用386TSS

; A <未定義>

; B 忙的386TSS

; C 386調用門

; D <未定義>

; E 386中斷門

; F 386陷阱門

;

; (5) G:    段界限粒度(Granularity)位。

; G=0 表示界限粒度爲字節;

; G=1 表示界限粒度爲4K 字節。

;           注意,界限粒度只對段界限有效,對段基地址無效,段基地址總是以字節爲單位。 

;

; (6) D:    D位是一個很特殊的位,在描述可執行段、向下擴展數據段或由SS寄存器尋址的段(通常是堆棧段)的三種描述符中的意義各不相同。 

;           ⑴ 在描述可執行段的描述符中,D位決定了指令使用的地址及操作數所默認的大小。

; ① D=1表示默認情況下指令使用32位地址及32位或8位操作數,這樣的代碼段也稱爲32位代碼段;

; ② D=0 表示默認情況下,使用16位地址及16位或8位操作數,這樣的代碼段也稱爲16位代碼段,它與80286兼容。可以使用地址大小前綴和操作數大小前綴分別改;變默認的地址或操作數的大小。 

;           ⑵ 在向下擴展數據段的描述符中,D位決定段的上部邊界。

; ① D=1表示段的上部界限爲4G;

; ② D=0表示段的上部界限爲64K,這是爲了與80286兼容。 

;           ⑶ 在描述由SS寄存器尋址的段描述符中,D位決定隱式的堆棧訪問指令(如PUSH和POP指令)使用何種堆棧指針寄存器。

; ① D=1表示使用32位堆棧指針寄存器ESP;

; ② D=0表示使用16位堆棧指針寄存器SP,這與80286兼容。 

;

; (7) AVL:  軟件可利用位。80386對該位的使用未左規定,Intel公司也保證今後開發生產的處理器只要與80386兼容,就不會對該位的使用做任何定義或規定。 

;



;----------------------------------------------------------------------------

; 在下列類型值命名中:

;       DA_  : Descriptor Attribute

;       D    : 數據段

;       C    : 代碼段

;       S    : 系統段

;       R    : 只讀

;       RW   : 讀寫

;       A    : 已訪問

;       其它 : 可按照字面意思理解

;----------------------------------------------------------------------------


; 描述符類型

DA_32 EQU 4000h ; 32 位段


DA_DPL0 EQU  00h ; DPL = 0

DA_DPL1 EQU  20h ; DPL = 1

DA_DPL2 EQU  40h ; DPL = 2

DA_DPL3 EQU  60h ; DPL = 3


; 存儲段描述符類型

DA_DR EQU 90h ; 存在的只讀數據段類型值

DA_DRW EQU 92h ; 存在的可讀寫數據段屬性值

DA_DRWA EQU 93h ; 存在的已訪問可讀寫數據段類型值

DA_C EQU 98h ; 存在的只執行代碼段屬性值

DA_CR EQU 9Ah ; 存在的可執行可讀代碼段屬性值

DA_CCO EQU 9Ch ; 存在的只執行一致代碼段屬性值

DA_CCOR EQU 9Eh ; 存在的可執行可讀一致代碼段屬性值


; 系統段描述符類型

DA_LDT EQU  82h ; 局部描述符表段類型值

DA_TaskGate EQU  85h ; 任務門類型值

DA_386TSS EQU  89h ; 可用 386 任務狀態段類型值

DA_386CGate EQU  8Ch ; 386 調用門類型值

DA_386IGate EQU  8Eh ; 386 中斷門類型值

DA_386TGate EQU  8Fh ; 386 陷阱門類型值



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章