操作系统如何执行内存保护?

4
一般来说,我知道进程无法向其地址空间中具有禁止写入的内存写入数据。但是,是什么检查进程是否可以这样做?是否所有汇编指令都要经过操作系统?它是如何工作的?
3个回答

10
在大多数现代CPU中(Intel x86,大多数ARM版本),是CPU本身进行检查。 CPU在寄存器之一中存储数据结构的地址,该结构指定内存的布局(“页表”) - 具体而言,哪些地址可读取,哪些可写入,哪些可执行。 CPU中的每个内存访问操作都会根据页表进行检查。
当程序尝试对相应页面表条目不允许的内存位置执行某些操作时,CPU会生成异常(中断),并且OS获得控制权。进一步的操作取决于OS。一个常见的情况涉及OS显示错误消息并终止有问题的程序。但并非必须如此。例如,通过相同的机制实现页面交换(将内存写出到磁盘上的页面文件并在需要时读回)。
页表由OS维护,通常对用户空间代码不可见。 OS中的相关部分是硬件相关的。

3

页面表包含了当前正在执行的进程内存空间的所有信息。当您尝试访问只读内存并写入它,或访问不属于您的内存时,处理器无法找到映射(或者发现您不能写入),并向操作系统发出页故障。然后,操作系统决定是复制写页,如果您访问的页根本不属于您但尚未映射,则还是您访问了错误的空间,并相应地处理它(通常使用段错误杀死进程,如果您访问错误的空间)。


3
当硬件支持时,通常在描述分配的内存块的信息中会有一个位,指示该内存块是否可以执行。
在英特尔处理器上,这被称为NX(不可执行)位,而AMD则称其为XD(禁用执行)位。
引用:
NX位专门指64位页表条目中位数63(即最高有效位)。如果将此位设置为0,则可以从该页执行代码;如果设置为1,则无法从该页执行代码,并且其中的任何内容都被视为数据。
链接:http://en.wikipedia.org/wiki/NX_bit 操作系统在将可执行代码加载到内存后设置该位。它只能由特权代码(例如操作系统或驱动程序)设置。
另请参见:http://en.wikipedia.org/wiki/Executable_space_protection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接