OS上的内存保护

时间:2013-02-23 20:36:26

标签: memory assembly operating-system protection

一般来说, 我知道进程无法写入具有不允许写入保护的内存(在其地址空间中)。 但是什么检查过程是否可以做到这一点?是否有任何汇编指令通过操作系统?它是如何工作的?

3 个答案:

答案 0 :(得分:4)

在大多数现代CPU(Intel x86,大多数ARM版本)中,CPU本身都会进行检查。 CPU在其中一个寄存器中存储指定存储器布局的数据结构的地址(“页表”) - 具体地说,哪些地址是可读的,哪些是可写的,哪些是可执行的。

当程序试图对相应页表条目不允许的内存位置执行某些操作时,CPU会生成异常(中断),并且OS会获得控制权。进一步的行动取决于操作系统。

页面表由操作系统维护,并且(通常)对用户区代码不可见。操作系统中的相关部分取决于硬件。

答案 1 :(得分:2)

当硬件支持此功能时,通常会在描述已分配内存块的信息中指示是否可以执行内存块。

在Intel处理器上,这称为NX(从不执行)位,而AMD称为XD(执行禁用)位。

  

NX位具体指的是页表中64位条目的位号63(即最高位)。如果该位设置为0,则可以从该页面执行代码;如果设置为1,则无法从该页面执行代码,并且假定驻留在那里的任何内容都是数据。

http://en.wikipedia.org/wiki/NX_bit

该位由操作系统在将可执行代码加载到内存后设置。它可能只能由特权代码(例如操作系统或驱动程序)设置。

另见:

http://en.wikipedia.org/wiki/Executable_space_protection

答案 2 :(得分:1)

页表,它们具有当前正在执行的进程的内存空间的所有信息。当您尝试访问只能通过写入来读取的内存,或者访问不属于您的内存时,处理器无法找到映射(或者看不到您的写入)并向操作系统发出页面错误。操作系统然后决定它是否是写页面上的副本,如果您访问的页面完全属于您但尚未映射,或者您刚刚访问了坏空间并相应地处理它(通常会使用段错误杀死该进程)如果你访问不好的空间)。