我读过这个描述TLB射击是什么的所以问题。我试图了解这是由内核或处理器执行的操作,还是两者兼而有之?
我的问题是:-
发布于 2018-05-09 16:00:29
x86 TLB不跨核共享,在硬件级别上它们之间也不同步。
是操作系统指示处理器刷新其TLB。
指示“当前”处理器等于调用一个函数,指示另一个处理器相当于创建一个IPI。
术语"TLB射击“明确地指这种(甚至比正常情况更多)昂贵的情况,为了保持系统的一致性,操作系统必须告诉其他处理器使它们的TLB失效,以便达到特定处理器的相同映射。
我认为,只有当新的映射影响到某些共享内存时,才有必要这样做,否则每个处理器都在执行一个进程的不同实例,每个实例都有其映射。
在上下文切换期间,TLB被刷新以删除旧的映射,这必须独立于运行计划程序的最后一个处理器。
由于处理器正在刷新自己的TLB,所以这不是TLB射击。
处理器之间必须始终保持一致的共享区域可以是:内核页、内存映射IO、共享内存映射文件。
执行指令invlpg、invpcid、移动到cr0、cr3 (包括在hw任务切换期间)或cr4和VMX转换都会使TLB失效。
有关确切的粒度和语义,请参见英特尔手册3的4.10.4节。
发布于 2018-05-10 01:57:21
TLB枪战到底是什么时候发生的?
当操作系统或管理程序请求它时,就会发生这种情况。
在ISA级别,某些操作可以执行TLB射击(参见英特尔手册V3 4.10.4和AMD手动TLB 5.5.2),从而使一个或多个本地或远程TLB缓存中的一个或多个TLB条目无效(相同CPU的其他逻辑核和具有TLB并共享相同物理内存地址空间的所有其他类型处理器的TLB条目)。
还请注意,任何分页结构条目都可以缓存,即使它没有被任何退出指令访问。这可能是由于投机执行或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。要查看Linux内核何时执行TLB无效的一些示例,请参阅tlb_flush_reason enum (注释是我的):
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:
目前未使用其他类型的INVPCID。
除了软件启动的TLB条目失效之外,英特尔手册第3卷第4.10.2.2节适用于P6微体系结构和大多数后续的微体系结构:
处理器不需要实现任何TLB。实现TLB的处理器可以在任何时候使任何TLB条目失效。软件不应依赖TLB的存在或TLB条目的保留。
据我所知,AMD手册中没有这样的声明。但也没有关于TLB保留的保证,所以我们可以为AMD处理器得出同样的结论。
https://stackoverflow.com/questions/50256740
复制相似问题