Linux 内核如何设置寄存器cr3?

Linux 内核如何设置寄存器cr3?,linux,x86,kernel,Linux,X86,Kernel,我了解处理器的mmu使用寄存器cr3将线性地址转换为物理地址,前提是cr3正确设置为页面目录的物理地址。但是,在内核分配了页表之后,它将如何找到表的物理地址并为其设置cr3 编辑:我说的是linux内核。我将假设您的问题在于:假设(一旦切换到保护模式)内核只写入虚拟地址,那么这意味着它将创建的页表(例如,用于新进程)写入虚拟地址。但是,既然内核必须将物理地址放入cr3,那么它如何将页表的虚拟地址转换为物理地址呢 简短的回答基本上是Margaret所说的:页面表位于内核地址空间,内核密切跟踪那里的

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


编辑:我说的是linux内核。

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

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

为了进一步充实这一点,Linux在内核中区分了两种类型的虚拟地址:

  • 内核虚拟地址-可以映射(概念上)到任何物理地址;及
  • 内核逻辑地址-这是一个线性映射到物理地址的虚拟地址
内核将页表放在逻辑地址中,因此您只需要关注本文讨论的页表

将逻辑地址映射到相应的物理地址只需要减去一个常量(例如,请参阅Linux中的
\uu pa
宏)

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

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


有关更多详细信息,您可以阅读相关的。

Well。。它创建了表格,以便知道它们在哪里?