深耕保护模式 |
您所在的位置:网站首页 › 保护模式寻址方式 › 深耕保护模式 |
什么是保护模式 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 8003f000gdt中存储的数据是段描述符,八个字节一组。 八个字节一组查询: dq 8003f000要想查询到更多的数据,命令: dq 8003f000 L40L后面是多少组。 段描述符结构: 前面四个字节(高八位)是图上面32位,后面四个字节(低八位)是图下面四个字节。 段选择子是一个16位数,该数决定了取gdt表中查哪一个数据。这个值就是MOV DS,AX给的AX的值,从这个值中取赋值剩下的80位(96-16)。 除了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 |