关于页表项的 accessed bit,OS 页表管理可以定期将其复位,但 TLB 一般不参与该 bit 位的管理(多核 TLB flush 是 CPU 没有硬件辅助的系统,TLB的 flush 全靠OS 来实现),因为 TLB 中的页表项均为最近要访问的(在虚拟化 VM 下,EPT也会用到TLB cache,存储 GVA -> HPA 的映射关系,因此 TLB 的 IPI shootingdown 会更严重)。例如,在 cpu load/store 内存时,如果对应的页表项不在 TLB 中,cpu 会 walk page table 并将页表项的 accessed bit 置位(如果之前已经被清除了),然后将该页表项更新到 TLB 中(这样 TLB 记录的页表项的 accessed bit 也是置位的)。如果 OS 的 reclaimer 将页表的 accessed bit 清除了,但 TLB 并不同步更新(上面已经说了:TLB 一般不参与该 bit 位的一致性管理),所以需要 flush 掉 TLB,保证下次 cpu load/store 同一块内存时会再次经历 page table walk,并置位 accessed bit(给页表 reclaimer 用,如果不 flush tlb 的话,页表中的 accessed bit 仍是0,但 TLB 中仍是 1,后续的 cpu 访问不会再设置页表中的 accessed bit 为1了,因为不再经历 page table walk),并更新 TLB,可见这个过程会使性能下降(导致 TLB shootdown)。
x86 clear accessed bit 后不 flush tlb
于 2024-01-22 23:24:29 首次发布