深耕保护模式

您所在的位置:网站首页 保护模式寻址方式 深耕保护模式

深耕保护模式

2022-05-13 09:56| 来源: 网络整理| 查看: 265

 

什么是保护模式

X86 CPU的3个工作模式:实模式、保护模式和虚拟8086模式。 现在的操作系统都是基于保护模式。 保护模式的两个重要机制:段的机制、页的机制。

 

段 段的机制

段的机制非常复杂,了解段机制就要先了解段寄存器。

段寄存器

汇编读写一个地址:

mov dword ptr ds:[0x123456],eax

读写的地址实际上是ds.Base+0x123456 段寄存器一共有八个:

ES CS SS DS FS GS LDTR TR

段寄存器的结构(一共96位):

只有16位的可见部分:Selecter。

可以通过结构体表示为如下:

struct SegMent { WORD Selecter; //16位的可见部分 WORD Atrributes; //16位的属性 DWORD Base; //32位的Base(从什么地方开始) DWORD Limit; //32位的Limit(长度) }

段寄存器的读取:

mov ax,ds //只能读16位可见部分

段寄存器的写入:

mov ds,ax //写入是96位

段寄存器属性:

段描述符

这里涉及到两张表:GDT(全局描述符表)与 LDT(局部描述符表)。windows用的是GDT表,LDT表几乎没用。

当我们执行类似MOV DS,AX指令时,CPU会查表,根据AX的值来决定查找GDT还是LDT,查找表的什么位置,查出多少数据。

gdtr是一个寄存器,里面存的是gdt表的开始位置和大小。

查看gdt表开始位置:

r gdtr

查看gdt表的大小:

r gdtl

查看某个位置的数据(四个字节一组):

dd 8003f000

gdt中存储的数据是段描述符,八个字节一组。

八个字节一组查询:

dq 8003f000

要想查询到更多的数据,命令:

dq 8003f000 L40

L后面是多少组。

段描述符结构:

前面四个字节(高八位)是图上面32位,后面四个字节(低八位)是图下面四个字节。

段选择子

段选择子是一个16位数,该数决定了取gdt表中查哪一个数据。这个值就是MOV DS,AX给的AX的值,从这个值中取赋值剩下的80位(96-16)。

RPL:请求特权级别。 TI:TI=0 查GDT表,TI=1 查LDT表。 Index:处理器将索引值乘以8在加上GDT或者LDT的基地址,就是要加载的段描述符。 加载段描述符至段寄存器(其他几个汇编指令修改段寄存器)

除了MOV指令,我们还可以使用LES、LSS、LDS、LFS、LGS指令修改寄存器。

CS不能通过上述的指令进行修改,CS为代码段,CS的改变会导致EIP的改变,要改CS,必须要保证CS与EIP一起改。

char buffer[6]; __asm { les ecx,fword ptr ds:[buffer] //高2个字节给es,低四个字节给ecx }

注意:RPL



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3