简介
存储器的保护功能可以禁止程序的非法内存访问,比如像代码段写入数据、访问段界限之外的内存。处理器执行过程中会对内存进行段界限、属性检查。
代码段保护
由于EIP 永远指向下一条将要执行的指令,故在代码段内有如下等式:
0<= EIP -1 <= 段界限
EIP 满足该等式将是正常的内存访问,否则处理器将会引起处理器异常
栈段保护
栈段是向下扩展的,每当往栈中压入数据时,EIP的内容要减去操作数长度。和向高地址方向扩展的段相比,栈段段界限就是段内不允许访问的最低端偏移地址。至于最高端偏移地址,则没有限制,最大可以是0xffffffff。进行栈操作是必须符合以下规则:
段界限+1 <= (ESP-操作数长度) <= 0xffffffff
数据段保护
这里的数据段有别于栈段,是向上扩展的数据段。对于内存访问指令如:
mov [0x2000],edx
这条指令把edx 寄存器4字节内容写入当前段内偏移0x2000 (EA,有效地址)为基址的内存单元,操作数为4字节。处理器访问数据段时,按一下规则检测:
0<= (EA+操作数大小-1) <= 段界限
段别名
为已有的段添加新的段描述符,则通过该段描述符将具有新段描述符属性。代码段描述符不能修改段中的内容,但不意味着通过其他描述符做不到。
程序代码
boot.s
org 0x7c00
[bits 16]
xor ax,ax
mov ss,ax
mov sp,0x7c00
;计算GDT所在的逻辑段地址
mov d