内核如何设置寄存器cr3?

smu*_*e49 2 linux x86 kernel

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

编辑:我说的是 linux 内核。

YSK*_*YSK 6

我将假设困扰您的是:假设(一旦切换到保护模式)内核只写入虚拟地址,那么这意味着它将它创建的页表(例如新进程)写入虚拟地址。但是既然内核必须把物理地址放进去cr3,那怎么才能把页表的虚拟地址转换成物理地址呢?

简短的回答基本上就是 Margaret 所说的:页表位于内核地址空间中,内核在那里密切跟踪虚拟->物理映射。

为了更详细地说明这一点,Linux 在内核中区分了两种类型的虚拟地址:

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

内核将页表放置在逻辑地址中,因此您只需在本次讨论中关注那些。

将一个逻辑地址映射到其对应的物理地址只需要减去一个常量(参见例如__paLinux源代码中的宏)。

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

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

有关更多详细信息,您可以阅读相关的Linux 设备驱动程序章节