gpt4 book ai didi

linux - 为什么每次从内核模块读取时 CR3 寄存器内容都不同?

转载 作者:IT王子 更新时间:2023-10-29 01:16:42 26 4
gpt4 key购买 nike

我正在编写一个内核驱动程序,目的是剖析 Linux 内核页表。我发现,每当我从驱动程序内部读取 CR3 寄存器时,每次读取 CR3 的内容都会不同!

为什么会这样?既然驱动在内核态执行,CR3需要指向内核页目录(对吧?),那为什么CR3每次都变了?

如果 CR3 不断变化,驱动程序如何按预期正确进行内存访问?

最佳答案

正如其他人所提到的,您看到的是当前进程的“分页表”。对于 x86,输入低于 3 的特权级别不会更改页表。这就是大多数操作系统为内核保留虚拟地址空间部分的原因。该空间中的内存被映射到每个进程中。通过将页框中的 u/s 标志设置为“0”,内核地址空间中的内存可以对用户模式代码隐藏。这将其标记为“系统”内存而不是用户内存。

更改页表通常在转换内核模式后完成,这就是内核内存需要成为进程地址空间的一部分的原因。否则它不知道在哪里可以找到它的数据结构。一个异常(exception)是“系统管理模式”,它透明地切换地址空间。然而,这只能在响应“系统管理中断”时发生,需要主板的特殊硬件支持,并且根据设计不能被操作系统抑制或响应。

否则,在保护模式下,页表的操作总是由操作系统完成,转换到内核模式之后。这就是“模式切换”比完整上下文切换更快的部分原因。

关于linux - 为什么每次从内核模块读取时 CR3 寄存器内容都不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com