首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谁来执行TLB枪战?

谁来执行TLB枪战?
EN

Stack Overflow用户
提问于 2018-05-09 15:14:08
回答 2查看 3.5K关注 0票数 7

我读过这个描述TLB射击是什么的所以问题。我试图了解这是由内核或处理器执行的操作,还是两者兼而有之?

我的问题是:-

  1. TLB枪战是否发生在上下文切换上?我假设不是,因为需要能够在多处理器CPU上并发执行多个进程。这个假设正确吗?
  2. TLB枪战到底是什么时候发生的?
  3. 谁来执行真正的TLB射击?是内核(如果是的话,我在哪里可以找到执行刷新的代码?)或者是CPU (如果是的话,是什么触发了操作)还是两者兼而有之(内核执行导致中断的指令,从而导致CPU执行TLB射击)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-09 16:00:29

x86 TLB不跨核共享,在硬件级别上它们之间也不同步。

是操作系统指示处理器刷新其TLB。

指示“当前”处理器等于调用一个函数,指示另一个处理器相当于创建一个IPI

术语"TLB射击“明确地指这种(甚至比正常情况更多)昂贵的情况,为了保持系统的一致性,操作系统必须告诉其他处理器使它们的TLB失效,以便达到特定处理器的相同映射。

我认为,只有当新的映射影响到某些共享内存时,才有必要这样做,否则每个处理器都在执行一个进程的不同实例,每个实例都有其映射。

在上下文切换期间,TLB被刷新以删除旧的映射,这必须独立于运行计划程序的最后一个处理器。

由于处理器正在刷新自己的TLB,所以这不是TLB射击。

处理器之间必须始终保持一致的共享区域可以是:内核页、内存映射IO、共享内存映射文件。

执行指令invlpginvpcid、移动到cr0cr3 (包括在hw任务切换期间)或cr4和VMX转换都会使TLB失效。

有关确切的粒度和语义,请参见英特尔手册3的4.10.4节。

票数 11
EN

Stack Overflow用户

发布于 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 (注释是我的):

代码语言:javascript
复制
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的非全局TLB条目。
  • 禁用CR4.PGE,然后向CR4写入CR4的当前值,然后重新启用CR4.PGE。这会对所有PCID和全局条目产生刷新所有TLB条目的效果。如果支持INVPCID,则不使用此方法。
  • 使用INVPCID指令类型0使给定PCID和虚拟地址的TLB条目无效。
  • 使用INVPCID指令类型2使所有TLB条目(包括globals和所有PCID)无效。

目前未使用其他类型的INVPCID。

相关:tlb射击和tlb冲水这两个术语是指相同的东西吗?.

除了软件启动的TLB条目失效之外,英特尔手册第3卷第4.10.2.2节适用于P6微体系结构和大多数后续的微体系结构:

处理器不需要实现任何TLB。实现TLB的处理器可以在任何时候使任何TLB条目失效。软件不应依赖TLB的存在或TLB条目的保留。

据我所知,AMD手册中没有这样的声明。但也没有关于TLB保留的保证,所以我们可以为AMD处理器得出同样的结论。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50256740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档