内核集如何注册cr3?

时间:2017-07-21 13:38:37

标签: linux x86 kernel

我了解处理器的mmu使用寄存器cr3将线性地址转换为物理地址,前提是cr3已正确设置为页面的物理地址目录。但是在内核分配了页表之后,它如何找到表的物理地址并将cr3设置为它?

编辑:我在谈论Linux内核。

1 个答案:

答案 0 :(得分:2)

我会假设你的问题是:假设(一旦切换到保护模式)内核只会写入虚拟地址,那么这意味着它会写入页面表创建(例如,对于新进程)到虚拟地址。但是由于内核必须将物理地址放入cr3,那么它如何将页面表的虚拟地址转换为物理地址?

简短的回答基本上就是玛格丽特所说的:页面表位于内核地址空间中,内核跟踪那里的虚拟>物理映射。

为了充分利用这一点,Linux可以区分内核中两种类型的虚拟地址:

  • 内核虚拟地址 - 可以(概念上)映射到任何物理地址;和
  • 内核逻辑地址 - 具有线性映射到物理地址的虚拟地址

内核将页表放在逻辑地址中,因此您只需要关注本讨论的内容。

将逻辑地址映射到其对应的物理地址只需要减去常量(例如,参见Linux source code中的__pa宏)。

例如,在x86上,物理地址0对应逻辑地址0xC0000000,物理地址0x8000对应逻辑地址0xC0008000。

因此,一旦内核将页表放在特定的逻辑地址中,它就可以轻松计算出它对应的物理地址。

有关详细信息,请阅读相关的Linux Device Drivers chapter