让我们关注单处理器计算机系统。据我所知,当创建一个进程时,会设置页表,它将虚拟地址映射到物理内存地址空间。每个进程都有自己的页表,存储在内核地址空间中。但是 MMU 如何为进程选择正确的页表,因为不仅有一个进程在运行,而且还会发生许多上下文切换?
任何帮助表示赞赏!
最好的,西蒙
让我们关注单处理器计算机系统。据我所知,当创建一个进程时,会设置页表,它将虚拟地址映射到物理内存地址空间。每个进程都有自己的页表,存储在内核地址空间中。但是 MMU 如何为进程选择正确的页表,因为不仅有一个进程在运行,而且还会发生许多上下文切换?
任何帮助表示赞赏!
最好的,西蒙
处理器有一个特权寄存器,称为页表基址寄存器 (PTBR),在 x86 上它是CR3。在上下文切换时,操作系统会更改 PTBR 的值,以便处理器现在知道要使用哪个页表。除了 PTBR,许多现代处理器还有地址空间编号 (ASN) 的概念。进程被赋予一个地址空间号(来自一个有限的池),并且这个 ASN 也被设置在上下文切换的寄存器中。此 ASN 用作 TLB 匹配的一部分,并允许来自多个地址空间的 TLB 条目共存。只有当一个 ASN 被重用时,才需要刷新 TLB,然后只对匹配该 ASN 的条目进行刷新。大多数 x86 实现比这更粗粒度,并且有一个全局页面的概念(用于共享库和共享数据)。
在这种情况下,MMU 完全不知道进程是什么。跟踪进程的操作系统会为每个进程生成一个页表,正如您所说,当它们被创建时。上下文切换的过程如下:
操作系统告诉 MMU 使用位于物理地址 0xFOO 的页表
操作系统对可编程中断计时器 (PIT) 进行编程,以在 BAR 毫秒后引起硬件中断。
操作系统恢复进程状态(CPU 寄存器、程序计数器等)并跳转到正确的地址。
该过程一直运行,直到 PIT 触发中断。
用于处理 PIT 中断的操作系统例程然后保存程序状态(寄存器等),使用调度算法来确定下一个要运行的进程(在简单的情况下,循环链表),然后从步骤 1 重新开始。
我希望这可以消除您可能存在的任何疑问。简短的回答:MMU 与进程无关,不知道进程是什么。