虚拟到物理内存映射如何工作
How does virtual to pyhsical memory mapping work
我目前正在尝试了解 Linux 的系统编程,但很难理解虚拟内存到物理内存的映射是如何工作的。
目前我的理解是两个进程P1
和P2
可以引用相同的虚拟地址,例如0xf11001
。现在这个内存地址被分成两部分。 0xf11
是页码,0x001
是该页内的偏移量(假设使用 4096 页大小)。为了找到物理地址,MMU 具有将页码映射到物理地址的硬件寄存器,可以说 0xfff
。最后一步是结合0xfff
和0x001
来找到物理0xfff001
地址。
然而这种理解毫无意义,相同的虚拟地址仍会指向相同的物理位置???为了使我的理解正确,我缺少哪一步???
您在这里错过了一个(关键的)步骤。一般来说,MMU 没有映射的硬件寄存器,而是有一个寄存器(page table base pointer)指向页[=17]的物理内存地址=](带有映射)用于当前 运行 进程(每个进程都是唯一的)。在上下文切换时,内核会更改此寄存器的值,因此对于每个 运行 进程,将执行不同的映射。
这里有关于这个主题的精彩介绍:http://www.eecs.harvard.edu/~mdw/course/cs161/notes/vm.pdf
我目前正在尝试了解 Linux 的系统编程,但很难理解虚拟内存到物理内存的映射是如何工作的。
目前我的理解是两个进程P1
和P2
可以引用相同的虚拟地址,例如0xf11001
。现在这个内存地址被分成两部分。 0xf11
是页码,0x001
是该页内的偏移量(假设使用 4096 页大小)。为了找到物理地址,MMU 具有将页码映射到物理地址的硬件寄存器,可以说 0xfff
。最后一步是结合0xfff
和0x001
来找到物理0xfff001
地址。
然而这种理解毫无意义,相同的虚拟地址仍会指向相同的物理位置???为了使我的理解正确,我缺少哪一步???
您在这里错过了一个(关键的)步骤。一般来说,MMU 没有映射的硬件寄存器,而是有一个寄存器(page table base pointer)指向页[=17]的物理内存地址=](带有映射)用于当前 运行 进程(每个进程都是唯一的)。在上下文切换时,内核会更改此寄存器的值,因此对于每个 运行 进程,将执行不同的映射。
这里有关于这个主题的精彩介绍:http://www.eecs.harvard.edu/~mdw/course/cs161/notes/vm.pdf