保护模式的学习

来源:互联网 发布:kali linux wifi 劫持 编辑:程序博客网 时间:2024/05/09 16:35

nasm语言中描述符可以使用宏%macro来赋值

%macro的使用方法如下

%macro为多行宏用法与单行宏%define相对应

%macro宏已%macro符位开始已%endmacro符号结束

%macro 后接宏的名称、名称后面接宏的传入参数个数

例如  %macro demo 2              这一行声明了demo为宏的名称 有两个传入参数

其中每个传入参数使用%加计数索引来表示(从1开始,例如%1表示第一个传入参数)

GDT(Global Descriptor Table)全局描述符表

它由64位2进制码组成

(63-56位)段基址2存放段基址的31-24位

(55位)G位段界限粒度位。G=0时段界限粒度为字节;G=1段界限粒度位4KB

(54位)D/B位分为三种情况

<1>在可执行代码描述符中,这一位叫D位。D=1时在默认情况下指令使用32位地址及32或8位操作数;

D=0时,在默认情况下使用下使用16位地址及16位或8位操作数

<2>在向下扩展数据段的描述符中,这一位叫做B位。B=1时,段的上部界限为4G;B=0时,段的上半部界限为64K

<3>在描述堆栈段(由SS寄存器指向的段)的描述符中,这一位叫做B位。B=1时,隐式的堆栈访问指令(如push、

pop和call)使用32位堆栈指针寄存器esp;B=0时,隐式的堆栈访问指令(如push、pop和call)使用16位堆栈指针寄存器sp

(53位)为0

(52位)AVL为保留为,可以被系统软件使用。

(51-48位)存放段界限的19-16位

(47位)P位存在位。P=1表示段在内存中存在;P=0表示段在内存中不存在。

(46-45位)DPL描述符特权级。特权级可以是0、1、2、3.数字越小特权级越大。

(44位)S位指明描述符是数据段/代码段描述符(S=1)还是系统段/门描述符(S=0)。

(43-40位)TYPE描述符类型

(39-16位)段基址的23-0位

(15-0位)段界限15-0位

这里使用宏Descriptor为GDT赋值

_________________________________________________________________________________________________________________________________________

伪指令dw、db与dd

db 为1字节

dw 为2字节

dd 为4字节

_________________________________________________________________________________________________________________________________________

在为GDT初始化时如                             段基址                 段界限          属性

LABEL_DESC_VIDEO:    Descriptor     0B8000h,            0ffffh,            92h的初始化过程如下            

%macro Descriptor 3

dw     %2 & 0ffffh                                                   ;设置段界限为0ffffh

dw     %1 & 0ffffh                                                   ;设置段基址前16位08000h

db     (%1 >> 16) & 0ffh                                         ;设置段基址的23-16位为0Bh、即段基址为0B8000h

dw     ((%2 >> 8) & 0f00h) | (%3 & 0f0ffh)              ;其中前半部分0ffh&0f00h位0h后半部分92h、即结果为0092h     2进制代码为         10010010

 段界限粒度为字节、段的上部界限为64k、描述符在段内存中存在、描述符特权级为0(最大)、数据段/代码段描述符、具有读写的权限

db     (%1 >> 24) & 0ffh                                         ;设置段基址2部分位00h

%endmacro

LDT(Local Descriptor Table)局部描述符表

而LDT的结构和赋值方式是与GDT相同的

IDT(Interrupt Descriptor Table)中断描述符表

IDT使用门描述符赋值

门描述符同样由64位组成

(63-48位)偏移的31-16位

(47位)P位存在位。P=1表示段在内存中存在;P=0表示段在内存中不存在。

(46-45位)DPL描述符特权级。特权级可以是0、1、2、3.数字越小特权级越大。

(44位)S位指明描述符是数据段/代码段描述符(S=1)还是系统段/门描述符(S=0)。

(43-40位)TYPE描述符类型

(39-37位)永远为0

(36-32位)Dcount的4-0位

(31-16)选择子15-0位

(15-0)偏移的15-0位

IDT的初始化时如

LABEL_IDT:

;门

%rep  255                          目标选择子                           偏移           DCount               属性       

                    Gate           SelectorCode32              SpuriousHandler      0                DA_386IGate      

%endrep

%macro  Gate  4

dw  (%2 & 0ffffh)                                                      SpuriousHandler   

dw  %1                                                                     SelectorCode32              

dw  (%3 & 1fh) | ((%4 << 8) & 0ff00h)                      8Eh << 8  & 0ff00h =>  08E00h

段在内存中、0优先级最高、门描述符、执行/读、一致码段、DCount=0

dw  ((%2 >> 16) & 0ffffh)                                          SpuriousHandler >> 16 & 0ffffh

原创粉丝点击