内核页表隔离

内核页表隔离（，缩写KPTI，也简称PTI，旧称KAISER）是Linux内核中的一种技术，旨在更好地隔离用户空间与内核空间的内存来提高安全性，缓解现代x86 CPU中的“熔毁（Meltdown）”硬件安全缺陷。

 前身 
KPTI补丁基于KAISER，它是一个用于缓解不太重要问题的早期补丁，当时业界还未了解到Meltdown的存在。

如果没有KPTI，每当执行用户空间代码（应用程序）时，Linux会在其分頁表中保留整个内核内存的映射，并保护其访问。这样做的优点是当应用程序向内核发送系统调用或收到中斷时，内核页表始终存在，可以避免绝大多数上下文交換相关的开销（TLB刷新、页表交换等）。

2005年，Linux内核采用了位址空間配置隨機載入（KASLR）隐匿用户空间中的相关内核地址，增加了利用其他内核漏洞的难度。尽管阻止了对这些内核映射的访问，但在此后发现，现有的英特尔x86处理器（截至2017年12月）还存在着多处可能泄露这些内存位置的旁路攻击，可能绕过KASLR。AMD称其处理器不受这些攻击的影响，所以不需要KPTI作为缓解措施。

 Meltdown漏洞与KPTI 
2018年1月，影响Intel x86处理器的熔毁漏洞被公布。KAISER补丁改为修复此问题，并更名为KPTI，因为新型攻击很类似，尽管更为严重。

 实现 
KPTI通过完全分离用户空间与内核空间页表来解决页表泄露。支持进程上下文标识符（PCID）特性的x86处理器可以用它来避免TLB刷新，但即便如此，它依然有很高的性能成本。据KAISER原作者称，其开销为0.28%；一名Linux开发者称大多数工作负载下测得约为5%，但即便有PCID优化，在某些情况下开销高达30%。

KPTI在2018年早期被合并到Linux内核4.15版，并被反向移植到Linux内核4.14.11。Windows和macOS也发布了类似的更新。

使用内核启动选项“pti=off”可以部分禁用内核页表隔离。依规定也可对已修复漏洞的新款处理器禁用内核页表隔离。

 参见 
 熔毁 (安全漏洞)
 幽灵 (安全漏洞)
 奔腾浮点除-{}-错误

 参考文献 

 外部链接 
 英特尔陷芯片安全问题漩涡_新浪网 
 KPTI documentation patch 

Category:Linux内核功能
Category:虚拟内存
Category:X86架構