Linux 的虚拟内存系统如何处理以下情况:
- 进程 1 将其虚拟页之一映射到物理帧 1。
- 上下文切换到进程 2。
- 进程 2 交换帧 1 并替换为它自己的内容。
- 上下文切换回进程 1。
进程 1 如何知道它不拥有帧 1 的内容并且需要进行交换?
答案1
从技术上讲,“process1”不知道这一点。每个进程都有一组页表。内核知道它将切换到哪个进程,并切换页表。这些页表的一部分是内核,在所有进程之间共享(因此,地址范围的某个部分,通常在 0xc0000000 到 0xffffffff 范围内 - 尽管并非所有这些页面都会存在)。通常,通过简单地使所有页表集指向“内核页表位”的同一共享部分来实现此共享部分。
拥有这个共享部分允许内核调用、陷阱和中断进入内核,无论当前正在运行哪个进程,或者该进程正在做什么。
具体如何工作取决于内核构建的体系结构,但例如在 x86(32 和 64 位)中,CR3 是指向当前页表的寄存器。因此,对于每个进程,都有一个指向页表的指针,并将其加载到 CR3 中,作为切换到新进程的一部分,就像为进程恢复寄存器值(至少是堆栈指针)一样1 接通时。
答案2
问题是关于两个进程上下文切换时的页框冲突,而不是关于虚拟内存地址空间(虚拟内存地址空间对于每个进程来说是唯一的,这不是新闻。)。这个堆栈溢出链接有完全相同的问题和精确的答案。 https://stackoverflow.com/questions/16581490/how-does-kernel-know-which-pages-in-the-virtual-address-space-correspond-to-as?lq=1