nasm下定义GDT结构

来源:互联网 发布:淘宝官网下载安装2016 编辑:程序博客网 时间:2024/05/19 13:59

预备知识:
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

;2LDT

;3忙的286TSS

;4286调用门

;5任务门

;6286中断门

;7286陷阱门

;8未定义

;9可用386TSS

;A<未定义>

;B忙的386TSS

;C386调用门

;D<未定义>

;E386中断门

;F386陷阱门

;

; (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_32EQU4000h; 32 位段


DA_DPL0EQU 00h; DPL = 0

DA_DPL1EQU 20h; DPL = 1

DA_DPL2EQU 40h; DPL = 2

DA_DPL3EQU 60h; DPL = 3


; 存储段描述符类型

DA_DREQU90h; 存在的只读数据段类型值

DA_DRWEQU92h; 存在的可读写数据段属性值

DA_DRWAEQU93h; 存在的已访问可读写数据段类型值

DA_CEQU98h; 存在的只执行代码段属性值

DA_CREQU9Ah; 存在的可执行可读代码段属性值

DA_CCOEQU9Ch; 存在的只执行一致代码段属性值

DA_CCOREQU9Eh; 存在的可执行可读一致代码段属性值


; 系统段描述符类型

DA_LDTEQU 82h; 局部描述符表段类型值

DA_TaskGateEQU 85h; 任务门类型值

DA_386TSSEQU 89h; 可用 386 任务状态段类型值

DA_386CGateEQU 8Ch; 386 调用门类型值

DA_386IGateEQU 8Eh; 386 中断门类型值

DA_386TGateEQU 8Fh; 386 陷阱门类型值