nasm下定义GDT结构
来源:互联网 发布:淘宝官网下载安装2016 编辑:程序博客网 时间:2024/05/19 13:59
预备知识: 定义如下: ; 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 陷阱门类型值
NASM中的位移运算符:"<<"表示左移和">>"表示右移。注意这里的位移总是无符号数(非负数)。并且位置时,左侧总是用0填充,不会出现符号扩展。可以理解成汇编语言中的逻辑左移和逻辑右移。
- nasm下定义GDT结构
- Nasm 结构体定义
- GDT
- GDT
- GDT
- Nasm
- NASM
- NASM
- nasm
- LInux 描述符GDT, IDT & LDT结构定义
- 五、结构体、文字显示与GDT/IDT初始化
- 5、结构体、文字显示与GDT/IDT初始化
- 结构体,文字显示与GDT/IDT初始化
- 遍历IDT表和分析GDT表结构
- 第5天 结构体、文字显示与GDT/IDT初始化
- [读书笔记]30 天自制操作系统 day5 结构体, 文字显示与GDT/IDT初始化
- gdt相关
- GDT详解
- 一个JAVA文件加密代码
- 123
- 三种方法遍历 Map
- Spring AOP 之 NameMatchDemo
- error:Could not initialize class net.sf.cglib.proxy.Enhancer
- nasm下定义GDT结构
- java spring 事务配置
- 香辣鸭头
- Struts2参数传递
- 加油哦
- 直接使用SMTP协议命令而在程序中实现电子邮件传送
- 获取硬件信息
- Spring AOP 之 RegexpMatchDemo
- Spring AOP 之 ThrowAdviceDemo