内核如何设置寄存器cr3?

5
我了解处理器的MMU使用寄存器cr3将线性地址转换为物理地址,前提是cr3被正确设置为页目录的物理地址。但在内核分配了页表后,内核如何找到表的物理地址并将cr3设置为它呢?
注:我谈论的是Linux内核。

嗯...它创建了表,所以它知道它们在哪里? - Margaret Bloom
1个回答

9
我会假设你的疑问是:假设内核只写入虚拟地址(一旦切换到保护模式),那么它创建的页表(例如针对新进程)就会被写入虚拟地址。但由于内核必须将物理地址放入cr3中,那么它如何将页表的虚拟地址转换为物理地址呢?
简短的答案基本上就是Margaret所说:页表位于内核地址空间中,内核密切跟踪其中的虚拟->物理映射关系。
为了更详细地解释,Linux在内核中区分两种类型的虚拟地址:
- 内核虚拟地址 - 可以(概念上)映射到任何物理地址; - 内核逻辑地址 - 是具有线性映射到物理地址的虚拟地址;
内核将页表放置在逻辑地址中,因此您只需要关注这些内容。
将逻辑地址映射到相应的物理地址只需要减去一个常数(例如,请参见 Linux 源代码中的__pa宏)。
例如,在x86上,物理地址0对应于逻辑地址0xC0000000,物理地址0x8000对应于逻辑地址0xC0008000。
因此,一旦内核将页面表放置在特定的逻辑地址中,它就可以轻松地计算出它对应的物理地址。
有关更多详细信息,请阅读相关的Linux设备驱动程序章节

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接