【问题标题】:Providing physical address directly to the TLB in x86-64在 x86-64 中直接向 TLB 提供物理地址
【发布时间】:2011-12-21 15:27:28
【问题描述】:

是否可以在 x86-64 架构上以长模式直接向 TLB 提供给定虚拟地址的物理地址?

例如,假设我在 PML4E 中设置了 0,因此会触发页面错误异常,因为会找到无效地址,在异常期间 CPU 可以通过使用某些指令告诉 TLB 该虚拟地址位于在 X 物理页框?

我想这样做是因为通过代码我可以很容易地判断物理地址在哪里,这样可以避免昂贵的页面遍历。

【问题讨论】:

  • 您如何知道地址将在哪个框架中?不是每次都是随机的吗?
  • 只有在软件而不是硬件 (TLB) 中执行它才会很昂贵,花费许多周期来保存和恢复 CPU 寄存器并在通往异常的过程中管理一些其他内核数据结构处理程序并返回。

标签: operating-system x86-64 tlb


【解决方案1】:

不,您需要将页面放入 TLB。准确地说,您需要创建/更新适当的 PTE(如果需要,使用 PDE 和 PDPE)。围绕 MMU 管理的一切都以某种方式基于页表和 TLB。甚至用户/管理员保护模式都是作为映射页面的特殊标志来完成的。

为什么你认为“page walk”是昂贵的操作?它一点也不贵。要确定必须更新的 PTE,您只需取消引用 4 个指针:PML4E -> PDPE -> PDE -> PTE。这些条目只是相关表中的索引。要获得 PML4E,您需要使用在页面错误处理期间获取的 39-47 位地址,并将该值用作 PML4 表中的索引。要获得 PDPE,您需要 30-39 位地址作为 PDE 表中的索引,依此类推。这不是可以减慢系统速度的东西。我认为分配物理页面需要更多时间。

【讨论】:

  • 如果您将物理页面地址存储在堆栈中,那么找到一个空闲页面是尽可能便宜的。如果您将一个 PDE 点返回到 PD(在原始 80386 2 级 PD/PT 方案中,或者在 Pentium 上可用的更深嵌套方案中类似),映射和取消映射页面也会变得非常快。
  • @Dan Kruchinin 如果我有办法告诉 TLB 物理地址,我会直接从 DS 寄存器中复制它。那将需要几个周期。但是每次 DRAM 访问取消引用 4 个指针大约需要 200ns + 它会将您的数据从缓存中逐出。现在,想象一下,应用程序随机读取 4K 页面...... MMU 是一种非常低效的内存寻址方式,而且正如我所见,没有办法摆脱它......
  • @Nulik:我不确定我是否遵循了您的尝试。处理器中有 TLB 缓存,因此它们不会一直取消引用 4 个指针。更重要的是,一旦 PTE 被缓存,您根本不会遇到异常(这是昂贵的!)。最重要的是,MMU 仅针对其配置与内存通信,而不是与 CPU 的 ALU/寄存器通信(实际上,它离它们很远)。
猜你喜欢
  • 2013-05-01
  • 2014-11-09
  • 2018-03-12
  • 2012-03-09
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多