07.存储器保护

本文介绍了存储器保护的重要性,详细讲解了代码段、栈段和数据段的保护机制,包括段界限和属性检查,防止非法内存访问。同时,讨论了段别名的概念,即通过不同描述符访问同一段的权限差异。最后,给出了相关程序代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

存储器的保护功能可以禁止程序的非法内存访问,比如像代码段写入数据、访问段界限之外的内存。处理器执行过程中会对内存进行段界限、属性检查。

代码段保护

由于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值