在大多数现代CPU中(Intel x86,大多数ARM版本),是CPU本身进行检查。 CPU在寄存器之一中存储数据结构的地址,该结构指定内存的布局(“页表”) - 具体而言,哪些地址可读取,哪些可写入,哪些可执行。 CPU中的每个内存访问操作都会根据页表进行检查。当程序尝试对相应页面表条目不允许的内存位置执行某些操作时,CPU会生成异常(中断),并且OS获得控制权。进一步的操作取决于OS。一个常见的情况涉及OS显示错误消息并终止有问题的程序。但并非必须如此。例如,通过相同的机制实现页面交换(将内存写出到磁盘上的页面文件并在需要时读回)。页表由OS维护,通常对用户空间代码不可见。 OS中的相关部分是硬件相关的。
页面表包含了当前正在执行的进程内存空间的所有信息。当您尝试访问只读内存并写入它,或访问不属于您的内存时,处理器无法找到映射(或者发现您不能写入),并向操作系统发出页故障。然后,操作系统决定是复制写页,如果您访问的页根本不属于您但尚未映射,则还是您访问了错误的空间,并相应地处理它(通常使用段错误杀死进程,如果您访问错误的空间)。
当硬件支持时,通常在描述分配的内存块的信息中会有一个位,指示该内存块是否可以执行。在英特尔处理器上,这被称为NX(不可执行)位,而AMD则称其为XD(禁用执行)位。引用:NX位专门指64位页表条目中位数63(即最高有效位)。如果将此位设置为0,则可以从该页执行代码;如果设置为1,则无法从该页执行代码,并且其中的任何内容都被视为数据。链接:http://en.wikipedia.org/wiki/NX_bit 操作系统在将可执行代码加载到内存后设置该位。它只能由特权代码(例如操作系统或驱动程序)设置。另请参见:http://en.wikipedia.org/wiki/Executable_space_protection