浮云间
到底什么时候发生TLB击落?当操作系统或系统管理程序请求它时,就会发生这种情况。在ISA级别,某些操作可以执行TLB击落,从而使一个或多个本地或远程TLB缓存中的一个或多个TLB条目无效(其他逻辑具有TLB并共享相同物理内存地址空间的同一CPU和所有其他类型的处理器的内核)。还要注意,即使没有任何退出的指令访问任何页面结构条目,也可以对其进行缓存。这可能是由于推测执行或MMU预取而发生的。因此,通常,任何条目都可以随时缓存或无效。当然,给出了特定的保证,以便可以管理MMU高速缓存并使其与内存中的分页结构保持一致。谁执行实际的TLB击落?是内核(如果是,在哪里可以找到执行刷新的代码?)还是CPU(如果是,则触发操作的原因)还是两者(内核执行导致中断的指令,依次导致CPU执行TLB击落)如前所述,CPU本身可以随时使任何条目无效。此外,当前特权级别(CPL)= 0的软件可以执行与TLB管理有关的任何操作。Linux内核中的TLB无效介绍Linux内核定义了与体系结构有关的TLB无效功能(/arch/x86/mm/tlb.c)和与体系结构有关的功能(/arch/x86/include/asm/tlbflush.h)。这是因为不同的体系结构为管理TLB提供了截然不同的机制。enum tlb_flush_reason { // The memory descriptor structure mm of the current process is about to change. // This occurs when switching between threads of different processes. // Note that when mm changes, the ASID changes as well (CR3[11:0]). // I'd rather not discuss when context switches occur because it's a whole different topic. // TLB shootdown only occurs for the current logical core. // The kernel sometimes can optimize away TLB flushes on a process-context switch. TLB_FLUSH_ON_TASK_SWITCH, // Another logical core has sent a request to the current logical core // to perform a TLB shootdown on its TLB caches. // This occurs due to a KVM hypercall. See TLB_REMOTE_SEND_IPI. TLB_REMOTE_SHOOTDOWN, // Occurs when one or more pages have been recently unmapped. // Affects only the local TLBs. TLB_LOCAL_SHOOTDOWN, // This occurs when making changes to the paging structures. // Affects only the local TLBs. TLB_LOCAL_MM_SHOOTDOWN, // Occurs when the current logical core uses a KVM hypercall to request // from other logical cores to perform TLB shootdowns on their respective TLBs. TLB_REMOTE_SEND_IPI, // This equals to the number of reasons. Currently not used. NR_TLB_FLUSH_REASONS,};在其他情况下,内核会刷新TLB。很难列出完整的清单,而且我认为没有人列出这样的清单。Linux内核实现了惰性TLB刷新技术。基本思想是,当修改进程的分页结构时,内核会尝试将TLB击落延迟到该进程中的线程将被调度为在使用模式下执行的时间。当前,Linux内核在需要时使用以下四种方法之一来刷新与当前逻辑内核关联的TLB:将CR3的当前值写入CR3。尽管这不会更改CR3中的值,但它指示逻辑内核刷新所有具有与CR3中的PCID相同的PCID的非全局TLB条目。禁用CR4.PGE,然后将CR4的当前值写入CR4,然后重新启用CR4.PGE。这具有刷新所有PCID和全局条目的所有TLB条目的效果。如果支持INVPCID,则不使用此方法。使用INVPCID指令类型0使给定PCID和虚拟地址的TLB条目无效。使用INVPCID指令类型2使所有TLB条目(包括全局变量和所有PCID)无效。当前未使用其他类型的INVPCID。相关:术语tlb downdown和tlb flush是否指的是同一件事。除了软件启动的TLB条目无效之外,英特尔手册第3卷第4.10.2.2节针对P6微体系结构和最新的微体系结构:处理器不需要实现任何TLB。确实实现TLB的处理器可以随时使任何TLB条目无效。软件不应依赖于TLB的存在或TLB条目的保留。据我所知,AMD手册中没有这样的陈述。但是也无法保证TLB的整体保留率,因此我们可以得出与AMD处理器相同的结论。