x86_64 CPU修改PTE为非存在未刷TLB时,写操作是否触发页错误?
问题解答
一、PTE存在位置0且未TLB shootdown时的CPU1写入行为
核心行为分析
当CPU0将PTE a的存在位(BIT0)置0但未执行TLB shootdown时,CPU1的TLB仍缓存着该PTE的有效翻译(存在位为1、可写),此时写入操作的结果分两种情况:
- 初始dirty位未置位:写入时CPU会尝试更新PTE的dirty位,但内存中的PTE存在位已为0,硬件检测到内存PTE与TLB缓存状态不一致,会触发页错误,这和你单线程测试的结果匹配。
- 初始dirty位已置位:写入操作无需更新dirty位,CPU直接通过TLB完成地址翻译并执行写入,不会触发页错误。这也是Linux内核提交
d950c9477d51f0cefc2ed3cf76e695d46af0d9c1中TLB延迟刷新逻辑的核心依据——已dirty的页在延迟刷新TLB期间,写入操作不会触发异常,可避免不必要的跨CPU中断开销。
关联内核提交说明
该提交针对kswapd内存回收场景优化TLB刷新策略:对于已标记为dirty的页,延迟发送TLB shootdown信号,直到该页被真正回收或需要同步PTE状态时再执行刷新,以此降低跨CPU中断的性能损耗。
二、RDMSR读取IA32_U_CET触发#GP的判断
读取IA32_U_CET MSR触发#GP(一般保护异常),基本可以判定CPU不支持CET(Control-Flow Enforcement Technology)功能。
验证逻辑
- CET是Intel在Tiger Lake及后续x86处理器中引入的安全特性,支持CET的CPU会在
CPUID.07H:EBX[bit 20]位返回置1的结果。 - 若CPU不支持CET,IA32_U_CET(地址
0x6A0)这类CET专属MSR不存在,硬件会直接触发#GP异常,阻止非法的MSR访问操作。
内容的提问来源于stack exchange,提问作者wang fuqiang
相关产品推荐
相关产品推荐

