我目前正在尝试了解Linux的系统编程,并且很难理解虚拟到物理内存映射的工作原理。
到目前为止我所理解的是,两个流程P1
和P2
可以引用相同的虚拟地址,例如0xf11001
。现在这个记忆地址分为两部分。 0xf11
是页码,0x001
是该页面内的偏移量(假设使用了4096页面大小)。为了找到物理地址,MMU具有将页面编号映射到物理地址的硬件注册表,可以说0xfff
。最后一步是将0xfff
与0x001
结合使用,以找到实际的0xfff001
地址。
然而,这种理解没有任何意义,相同的虚拟地址仍将指向相同的物理位置???我错过了什么步骤以便我的理解是正确的?
答案 0 :(得分:1)
你在这里错过了一个(关键)步骤。一般情况下,MMU没有带映射的硬件寄存器,而是一个寄存器(页表基指针),它指向当前页表的物理内存地址(带映射)运行过程(每个过程都是唯一的)。在上下文切换时,内核会更改此寄存器的值,因此对于每个正在运行的进程,将执行不同的映射。
以下是关于此主题的精彩演示:http://www.eecs.harvard.edu/~mdw/course/cs161/notes/vm.pdf