为了账号安全,请及时绑定邮箱和手机立即绑定

谁执行TLB击落?

谁执行TLB击落?

小唯快跑啊 2021-04-03 18:19:40
我读了这样一个问题,描述了什么是TLB击落。我试图了解这是内核执行还是处理器执行的操作,还是两者都执行?我的问题是:上下文切换时会发生TLB击落吗?我假设不会,因为需要能够在多处理器CPU上同时执行多个进程。这个假设正确吗?到底什么时候发生TLB击落?谁执行实际的TLB击落?是内核(如果是,在哪里可以找到执行刷新的代码?)还是CPU(如果是,则触发操作的原因)还是两者(内核执行导致中断的指令,依次导致CPU执行TLB击落)
查看完整描述

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处理器相同的结论。


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信