我了解处理器的mmu使用寄存器cr3
将线性地址转换为物理地址,前提是cr3
已正确设置为页面的物理地址目录。但是在内核分配了页表之后,它如何找到表的物理地址并将cr3
设置为它?
答案 0 :(得分:2)
我会假设你的问题是:假设(一旦切换到保护模式)内核只会写入虚拟地址,那么这意味着它会写入页面表创建(例如,对于新进程)到虚拟地址。但是由于内核必须将物理地址放入cr3
,那么它如何将页面表的虚拟地址转换为物理地址?
简短的回答基本上就是玛格丽特所说的:页面表位于内核地址空间中,内核跟踪那里的虚拟>物理映射。
为了充分利用这一点,Linux可以区分内核中两种类型的虚拟地址:
内核将页表放在逻辑地址中,因此您只需要关注本讨论的内容。
将逻辑地址映射到其对应的物理地址只需要减去常量(例如,参见Linux source code中的__pa
宏)。
例如,在x86上,物理地址0对应逻辑地址0xC0000000,物理地址0x8000对应逻辑地址0xC0008000。
因此,一旦内核将页表放在特定的逻辑地址中,它就可以轻松计算出它对应的物理地址。
有关详细信息,请阅读相关的Linux Device Drivers chapter。