
x86_has_pat_wp()是 Linux 内核 x86 架构中用于检测当前 CPU 是否支持通过 PATPage Attribute Table实现 Write-ProtectWP缓存模式的辅助函数。核心作用这个函数要回答一个关键问题我们能否用 PAT 机制来标记一个页面为“写保护”WP缓存类型这个能力对于实现CONFIG_STRICT_KERNEL_RWX和CONFIG_STRICT_MODULE_RWX等安全特性至关重要——它允许内核将只读的代码和数据页真正地在硬件层面标记为不可写即使是通过内核自身直接映射的地址访问。代码逻辑解析bool x86_has_pat_wp(void) { uint16_t prot __cachemode2pte_tbl[_PAGE_CACHE_MODE_WP]; return __pte2cachemode_tbl[__pte2cm_idx(prot)] _PAGE_CACHE_MODE_WP; }这两行代码实现了一个“编码 → 解码”的往返验证正向转换从__cachemode2pte_tbl表中取出_PAGE_CACHE_MODE_WP对应的 PTE 保护位prot。逆向验证通过__pte2cm_idx(prot)将 PTE 位转换为__pte2cachemode_tbl表的索引再查表得到解码后的缓存模式。比较判断如果解码结果等于_PAGE_CACHE_MODE_WP说明这个 CPU 的 PAT 表确实支持 WP 模式返回true否则返回false。背景PAT 与 WP 缓存模式x86 的 PATPage Attribute Table允许通过页表项中的 PCD、PWT 和 PAT 三个位组合定义 8 种不同的内存缓存类型。其中WPWrite-Protect模式的行为是读操作正常缓存写操作会穿透缓存直接写入内存。这个特性被内核用来实现“只读”映射的硬件级保护。然而并非所有 x86 CPU 都支持 PAT 的 WP 模式。如果 CPU 不支持那么将_PAGE_CACHE_MODE_WP编码到 PTE 中解码回来可能得到其他缓存模式如UC或WT导致页面的实际行为与预期不符。x86_has_pat_wp()正是用来在启动时探测这个能力的。调用场景这个函数通常在pat_init()或相关的初始化代码中被调用。如果返回false内核会避免使用 WP 模式来标记只读页面转而依赖传统的_PAGE_RW位清除来提供写保护。这确保了在不同代际的 x86 硬件上内核的只读保护机制都能正确工作。