Process 进程之间的上下文切换是否会使MMU(内存控制单元)失效?

Process 进程之间的上下文切换是否会使MMU(内存控制单元)失效?,process,operating-system,cpu,mmu,Process,Operating System,Cpu,Mmu,这是我系统讲座的PowerPoint中的一句话,但我不明白为什么上下文切换会使MMU失效。我知道它会使缓存失效,因为缓存包含另一个进程的信息。然而,对于MMU,它只是将虚拟内存映射到物理内存。如果上下文切换使其无效,这是否意味着MMU在不同的进程中使用不同的映射机制 这是否意味着MMU在不同的流程中使用不同的映射机制 你的结论基本上是正确的。 每个进程都有从虚拟地址到物理地址的映射(称为上下文)。 例如,对于进程A,地址0x401000可以转换为0x01234567,对于进程B,地址0x89ab

这是我系统讲座的PowerPoint中的一句话,但我不明白为什么上下文切换会使MMU失效。我知道它会使缓存失效,因为缓存包含另一个进程的信息。然而,对于MMU,它只是将虚拟内存映射到物理内存。如果上下文切换使其无效,这是否意味着MMU在不同的进程中使用不同的映射机制

这是否意味着MMU在不同的流程中使用不同的映射机制

你的结论基本上是正确的。
每个进程都有从虚拟地址到物理地址的映射(称为上下文)。
例如,对于进程A,地址0x401000可以转换为0x01234567,对于进程B,地址0x89abcdef。
使用不同的上下文可以简化流程、按需分页和简化重新定位

因此,每个上下文切换必须使TLB无效,否则CPU将继续使用旧的翻译

但是,有些页面是全局的,这意味着它们具有与当前进程地址空间无关的相同翻译。
例如,内核代码以相同的方式映射到每个进程adn,因此不需要重新映射

因此,最终只有TLB的一部分无效。
你可以通过阅读《如何》来了解应用理论的真实例子

这是否意味着MMU在不同的流程中使用不同的映射机制

你的结论基本上是正确的。
每个进程都有从虚拟地址到物理地址的映射(称为上下文)。
例如,对于进程A,地址0x401000可以转换为0x01234567,对于进程B,地址0x89abcdef。
使用不同的上下文可以简化流程、按需分页和简化重新定位

因此,每个上下文切换必须使TLB无效,否则CPU将继续使用旧的翻译

但是,有些页面是全局的,这意味着它们具有与当前进程地址空间无关的相同翻译。
例如,内核代码以相同的方式映射到每个进程adn,因此不需要重新映射

因此,最终只有TLB的一部分无效。

您可以阅读how,了解应用理论的真实示例。

您所描述的完全是特定于系统的

首先,他们可能指的是使MMU缓存无效。假设MMU有一个缓存(可能是现在,但不保证)

当发生上下文切换时,处理器已将MMU设置为一种状态,在这种状态下,前一个进程的剩余内容将使新进程出错。如果没有,缓存将把新进程的逻辑页映射到旧进程的物理页帧

例如,一些处理器使用一个页面表作为系统空间,使用一个或多个其他页面表作为用户空间。在上下文切换之后,处理器最好使用户空间页表的任何缓存无效,但不要对系统表进行任何缓存


请注意,在大多数处理器中,所有这些都是完全在幕后完成的。即使是操作系统程序员也不需要处理(甚至不需要意识到)MMU的任何刷新或失效。有一个单独的switch进程上下文指令处理所有事情。其他处理器要求操作系统程序员处理附加任务,作为上下文切换的一部分,在一些古怪的处理器中,上下文切换包括显式刷新MMU缓存。

您所描述的完全是系统特定的

首先,他们可能指的是使MMU缓存无效。假设MMU有一个缓存(可能是现在,但不保证)

当发生上下文切换时,处理器已将MMU设置为一种状态,在这种状态下,前一个进程的剩余内容将使新进程出错。如果没有,缓存将把新进程的逻辑页映射到旧进程的物理页帧

例如,一些处理器使用一个页面表作为系统空间,使用一个或多个其他页面表作为用户空间。在上下文切换之后,处理器最好使用户空间页表的任何缓存无效,但不要对系统表进行任何缓存


请注意,在大多数处理器中,所有这些都是完全在幕后完成的。即使是操作系统程序员也不需要处理(甚至不需要意识到)MMU的任何刷新或失效。有一个单独的switch进程上下文指令处理所有事情。其他处理器要求操作系统程序员作为上下文切换的一部分来处理额外任务,在一些古怪的处理器中,上下文切换包括显式刷新MMU缓存。

一些MMU具有ASID,可以避免使上下文切换上的缓存翻译无效。是的,有各种方法可以(也可以)实现这一点。底线是必须有这样的机制(或者没有机器)。这通常是在幕后进行的,所以程序员甚至看不到。一些MMU有ASID,可以避免在上下文切换上使缓存的翻译无效。是的,有各种各样的方法可以做到这一点。底线是必须有这样的机制(或者没有机器)。这通常是在幕后,所以程序员甚至看不到它。