2 回答
TA贡献1829条经验 获得超4个赞
到底什么时候发生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处理器相同的结论。
- 2 回答
- 0 关注
- 271 浏览
添加回答
举报