图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

目录
  • PAGE_NX 原理

  • PAGE_NX 的应用

  • PAGE_NX 使用场景

图片无法显示,请右键点击新窗口打开图片


PAGE_NX 原理

图片无法显示,请右键点击新窗口打开图片

在 Linux 页表里存在这样一个标志位 PAGE_NX, 用于表示页表映射的物理区域不可被处理器执行任何代码,另外这里的物理区域可以是系统管理的物理内存(OSMEM)、系统预留物理内存(RSVDMEM)、以及外设寄存器映射到系统地址空间形成的 MMIO. 当处理器尝试在该页面执行代码,那么会直接触发一个缺页异常,缺页异常的原因是 PF_EXEC. 这个功能在现代操作系统中非常重要,因为它是实现所谓的“执行保护”“数据执行预防”(DEP,Data Execution Prevention)的关键。DEP 是一种安全特性,旨在防止攻击者通过执行内存中的恶意代码来攻破系统。例如这可以防止缓冲区溢出攻击,其中攻击者尝试在数据区域(如栈或堆)中注入代码,并强制程序执行这些代码.

图片无法显示,请右键点击新窗口打开图片

PAGE_NX 标志位可能在不同的硬件架构的位置不同,但 Linux 为了屏蔽硬件差异,统一使用 _PAGE_NX 标志位表示,也可以使用 __NX 进行表示. 例如在 X86/I386 中 PAGE_NX 位于页表的 BIT63. 在 x86 架构中,这个特性通常被称为 XD(执行禁止),而在 AMD 处理器中称为 EVP(增强型病毒保护). 在 ARM 架构中,则被称为 XN(执行从不).

图片无法显示,请右键点击新窗口打开图片

在 Linux 里,很多页表属性集合都会将 PAGE_NX 标志为置位,例如 __PAGE_KERNEL 用于为内核空间虚拟内存构建页表使用,此时都会将 PAGE_NX 标志位设置上,以此表示内核对这块区域没有执行代码的权限. 例如 __PAGE_KERNEL_EXEC 属性集合的 PAGE_NX 标志清零则表示这块区域可以执行代码的权限.

图片无法显示,请右键点击新窗口打开图片

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片