在上下文切换时刷新 TLB

Flush TLB on a context swtich

这可能取决于 OS,但一般来说,据我了解,当发生页面错误(所需页面不在主内存中)时,OS 将指示 CPU 从磁盘读取页面,我想知道 OS 是否在磁盘 I/O 时分派到另一个进程?如果是这样,那么在上下文切换时将完全刷新 TLB,对吗?

或多或少,但是页面错误并不总是意味着该页面在磁盘上(它也可能根本不存在,是延迟分配页面,是写时复制页面写入,存在但被标记为 unreadable/unwritable,等等)。但如果是这样的话,它可能至少会安排另一个线程,因为磁盘 IO 大约需要永远。

所需的切换量取决于它切换到什么,在同一上下文的线程之间切换并不意味着 TLB 刷新。如果 TLB 刷新是必要的,它可能不是 complete 刷​​新,因为全局页面(所以通常,您不会刷新内核页面的 TLB 条目)。还有 PCID 可以避免完全刷新(刷新可以限制为指定的进程上下文 ID),但这是最近才出现的,而且使用起来很棘手,因为只有 4096 个不同的 ID。

特定于进程的页面在 TLB 条目中被标记为具有 nG(非全局)位的非全局条目,并且还存储 pid(ARM 术语中的地址 ID)。 现在这篇文章把这个概念说得很清楚了。

》对于非全局条目,当TLB被更新,条目被标记为非全局时,TLB条目中除了正常的翻译信息外,还会存储一个值,这个值称为Address Space ID (ASID),这是由 OS 分配给每个单独任务的编号。如果当前 ASID 与存储在条目中的 ASID 匹配,则后续 TLB 查找仅匹配该条目。这允许多个有效的 TLB 条目存在于标记为非全局但具有不同 ASID 值的特定页面。换句话说,我们不一定需要在上下文切换时刷新 TLB。"

来源:https://developer.arm.com/documentation/den0024/a/The-Memory-Management-Unit/Context-switching