虚拟到物理内存映射如何工作

How does virtual to pyhsical memory mapping work

我目前正在尝试了解 Linux 的系统编程,但很难理解虚拟内存到物理内存的映射是如何工作的。

目前我的理解是两个进程P1P2可以引用相同的虚拟地址,例如0xf11001。现在这个内存地址被分成两部分。 0xf11 是页码,0x001 是该页内的偏移量(假设使用 4096 页大小)。为了找到物理地址,MMU 具有将页码映射到物理地址的硬件寄存器,可以说 0xfff。最后一步是结合0xfff0x001来找到物理0xfff001地址。

然而这种理解毫无意义,相同的虚拟地址仍会指向相同的物理位置???为了使我的理解正确,我缺少哪一步???

您在这里错过了一个(关键的)步骤。一般来说,MMU 没有映射的硬件寄存器,而是有一个寄存器(page table base pointer)指向页[=17]的物理内存地址=](带有映射)用于当前 运行 进程(每个进程都是唯一的)。在上下文切换时,内核会更改此寄存器的值,因此对于每个 运行 进程,将执行不同的映射。

这里有关于这个主题的精彩介绍:http://www.eecs.harvard.edu/~mdw/course/cs161/notes/vm.pdf