1. KPTI(页表隔离)如何通过用户/内核双页表缓解 Meltdown,PCID 又在其中起到什么降低开销的作用?
请解释 KPTI(页表隔离)如何通过用户/内核双页表缓解 Meltdown,以及 PCID 在其中降低开销的作用?
- KPTI 双页表机制
- 缓解 Meltdown 原理
- PCID 降低开销
KPTI 将用户态与内核态使用不同的页表:用户态进程运行时不映射内核地址(或只映射最小必要入口),因此用户态投机访问内核地址会因缺少映射立即触发 page fault,无法利用乱序执行泄漏内核内存,从而缓解 Meltdown。切换内核态时再切换到完整内核页表。代价是每次系统调用/中断都需切换页表(CR3),导致 TLB 失效。PCID(Process Context ID)允许 TLB 条目带进程上下文标识,切换 CR3 时无需刷新全部 TLB,只需切换 PCID,保留用户态 TLB 条目,显著降低切换开销。KPTI + PCID 使 Meltdown 缓解的同时将性能影响降到很低。
双页表消除 Meltdown 可利用面,PCID 避免 TLB 全量刷新,一攻一守,既安全又高效。