【问题标题】:How can I get CR3 value?如何获得 CR3 值?
【发布时间】:2011-09-20 17:04:59
【问题描述】:

如何获得 CR3 值?

另外,我怎样才能得到进程 A(比如 Firefox)的 CR3 值?

有什么命令可以用来读取当前的 CR3 吗?

谢谢!

【问题讨论】:

  • x86 要么处于保护模式,要么不处于保护模式。一旦你处于保护模式(Linux 是),处理器不能只减去一个固定的偏移量,所以内核也需要被映射
  • 我想说的是:线性映射是内核内存的一个属性。例如:内核代码虚拟地址从0xc0100000开始,其对应的物理地址是0x00100000。我想理解的是:为什么会这样?

标签: memory linux-kernel cpu-registers


【解决方案1】:

来自here

我试图了解 PGD(页面全局目录)的扩展内容 存储在 CR3 寄存器中的值指示正在运行的进程/线程 Linux 调度程序。

我知道每个进程都有自己的 PGD 值,但我对此感到困惑 是内核线程调度时CR3寄存器的值。

内核线程只是借用最新调度进程的 PGD(即 意味着,整个地址空间)....这样做是为了节省不必要的 TLB 刷新,因为内核线程在内核空间中运行,这就是 对所有进程都相同

所以为了避免 TLB(Translation Lookaside Buffer)刷新,内核只使用当前用户模式进程中的 PGD,而在用户模式中,CR3 寄存器会在每次启动新进程时发生变化,因为它们位于不同的虚拟地址,所以我猜它们的映射会不同。

【讨论】:

  • 这就是为什么你在 linux 32 位上只有 3Gb 的地址空间,最后 1Gb 是内核映射,(所有进程都获得相同的内核地址空间映射)。 32 位 Windows 的做法类似,但默认为内核地址空间保留 2Gb。
  • 是的。我同意你的看法。所有进程对内核地址空间都有相同的映射。虽然它们的CR3不同,但PGD和页表的翻译条目是相同的,这就是它们产生相同物理地址的原因。
【解决方案2】:

但今天在易受例如幽灵漏洞的英特尔处理器上,引入了新的缓解措施:KPTI(内核指针表隔离)。它使您的进程的 cr3 仅映射内核的一小部分(只有访问中断/系统调用所必需的代码/结构)。接下来 cr3 寄存器被切换并替换为您的内核的 cr3,它相当于您的进程的 cr3,尽管它也将所有内核和用户空间页面(调用进程的)映射为 NX 位集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 2019-12-19
    • 2010-12-29
    • 2015-01-17
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多