【问题标题】:Does the MMU mediate everything between the operating system and physical memory or is it just an address translator?MMU 是调解操作系统和物理内存之间的一切,还是只是一个地址转换器?
【发布时间】:2011-06-16 06:38:27
【问题描述】:

当我们想为特定的虚拟内存地址分配一些值时,我试图了解操作系统是如何工作的。

我的第一个问题是关于 MMU 是否处理 CPU 和 RAM 之间的所有事情。这是真的?从维基百科上可以读到的内容,我会这么说:

内存管理单元 (MMU),有时称为分页内存 管理单元(PMMU),是一台计算机 硬件组件负责 处理对请求的内存的访问 由 CPU。

如果是这样,如何告诉 MMU 我想要获取 8 个字节、64 个或 128 个字节?写作呢?

如果不是这样,我猜 MMU 只是将虚拟地址转换为物理地址?

当 MMU 检测到我们所说的页面错误时会发生什么?我想它必须告诉 CPU 以便 CPU 将页面本身从磁盘加载,还是 MMU 能够做到这一点?

谢谢

【问题讨论】:

  • 请进一步阅读该维基百科条目:en.wikipedia.org/wiki/Memory_management_unit#How_it_works 对 MMU 的功能以及如何通过页表进行控制的公平描述。然后介绍了几种具体的架构。
  • 那篇文章没有说明当我尝试设置 someAddress = 10 时发生了什么,也没有说明页面是如何加载到内存中的......
  • 内存控制器执行实际传输。 MMU 只会转换地址,但几乎所有现代处理器架构都使用“内存保护单元”(MPU),它是一种增强型 MMU,它还根据存储在页表中的标志限制读取、写入或执行访问。
  • 虽然不是很相关,有兴趣的可以看看here.

标签: operating-system virtual-memory


【解决方案1】:

吞噬极​​乐世界,

我将尝试一一回答您的问题,但请注意,您最好准备一本操作系统课程或计算机体系结构入门课程的教科书。

MMU 由一些硬件逻辑和状态组成,其目的实际上是产生物理地址并提供/接收来自内存控制器的数据。实际上,内存转换的工作是通过硬件和软件 (OS) 机制的协作来完成的(至少在现代 PC 中是这样)。一旦获得物理地址,CPU 基本上就完成了它的工作,现在将地址发送到总线上,该总线在某个点连接到实际的内存芯片。在许多系统中,此总线称为前端总线 (FSB),它又连接到内存控制器。该控制器获取 CPU 提供的物理地址,并使用它与 DRAM 芯片交互,并最终提取内存阵列正确行和列中的位。然后将数据发送回 CPU,CPU 现在可以对其进行操作。请注意,我在此描述中不包括缓存。

所以不,MMU 不直接与 RAM 交互,我假设您使用它来表示物理 DRAM 芯片。而且你不能告诉 MMU 你想要 8 个字节,或 24 个字节,或者其他什么,你只能提供一个地址。获得多少字节取决于您所在的机器以及它是字节寻址的还是字寻址的。

您的最后一个问题促使我提醒您:MMU 实际上是 CPU 的一部分——它位于同一个硅芯片上(尽管并非总是如此)。

现在,让我们以页面错误为例。假设我们的用户级应用程序想要,如您所说,设置 someAddress = 10,我将逐步进行。让我们假设 someAddress 是 0xDEADBEEF,现在让我们忽略缓存。

1) 应用程序向 0xsomeAddress 发出存储指令,它在 x86 中可能类似于

mov %eax, 0xDEADBEEF

其中 10 是 eax 寄存器中的值。

2) 在这种情况下,0xDEADBEEF 是一个虚拟地址,必须进行转换。大多数情况下,虚拟地址到物理地址的转换将在称为转换后备缓冲区 (TLB) 的硬件结构中提供,它将非常快速地为我们提供这种转换。通常,它可以在一个时钟周期内完成。如果翻译在 TLB 中,称为 TLB 命中,则可以立即继续执行(即 0xDEADBEEF 对应的物理地址和值 10 被发送到内存控制器进行写入)。

3) 假设翻译在 TLB 中不可用(称为 TLB 未命中)。然后我们必须在页表中找到翻译,页表是内存中的结构,其结构由硬件定义并由操作系统管理。它们只包含将虚拟地址映射到物理地址的条目(更准确地说,是虚拟页号到物理页号)。但是这些结构也驻留在内存中,因此必须有地址!硬件包含一个名为 cr3 的特殊寄存器,其中包含当前页表的物理地址。我们可以使用我们的虚拟地址对该页表进行索引,因此硬件获取 cr3 中的值,通过添加偏移量来计算地址,然后进入内存以获取页表条目 (PTE)。这个 PTE 将(希望)包含对应于 0xDEADBEEF 的物理地址,在这种情况下,我们将此映射放在 TLB 中(因此我们不必再次遍历页表)并继续前进。

4) 但是哦,不!如果 0xDEADBEEF 的页表中没有 PTE 怎么办?这是一个页面错误,这就是操作系统发挥作用的地方。我们从页表中得到的 PTE 是存在的,因为它是(假设)一个有效的内存地址来访问,但是操作系统还没有为它创建一个 VA->PA 映射,所以它会有一个位设置表示它是无效的。硬件的编程方式是,当它在访问时看到这个无效位时,它会产生异常,在这种情况下是页面错误。

5) 异常会导致硬件通过跳转到一个众所周知的位置(称为处理程序的一段代码)来调用操作系统。可以有许多异常处理程序,页面错误处理程序就是其中之一。页面错误处理程序将知道导致错误的地址,因为它存储在某处的寄存器中,因此将为我们的虚拟地址 0xDEADBEEF 创建一个新映射。它将通过分配一个空闲的物理内存页面然后说“VA x 和 VA y 之间的所有虚拟地址将映射到这个新分配的物理内存页面内的某个地址”来做到这一点。 0xDEADBEEF 将在该范围内的某个位置,因此映射现在安全地位于页表中,我们可以重新启动导致页面错误的指令(mov)。

6) 现在,当我们再次检查页表时,我们将找到一个映射,我们提取的 PTE 将有一个不错的物理地址,即我们想要存储的地址。我们将值 10 提供给内存控制器,我们就完成了!

缓存将极大地改变这个游戏,但我希望这有助于说明分页是如何工作的。同样,查看一些 OS/Computer Architecture 书籍会让您受益匪浅。我希望这很清楚。

【讨论】:

  • 想再添加一个问题。 MMU也负责总线仲裁,对吧?您认为它如何确定哪个内核(或启用 DMA 的设备或 DMA 控制器)应该接管地址总线?以及它如何管理该总线上的争用?
  • MMU 不参与总线仲裁。实际上,当前的计算机硬件并没有使用我认为的总线——它们使用点对点链接,安排为“片上网络”或“结构”,并且仲裁对内存的访问是由内存互连(网络 /织物)。
  • 此答案中的寄存器名称属于 Intel CPU。其他架构有不同的名称。有关 RISC-V 的 MMU 规范,请参阅 riscv.org/specifications/privileged-isa。您还可以下载各种 RISC-V 实现的代码以查看它们是如何实现的。
  • MMU如何在不咨询存储在RAM中的页表条目的情况下进行翻译?
【解决方案2】:

有一些数据结构描述了哪些虚拟地址对应于哪些物理地址。操作系统创建和管理这些数据结构,CPU 使用它们将虚拟地址转换为物理地址。

例如,操作系统可能会使用这些数据结构来表示“从 0x00000000 到 0x00000FFF 范围内的虚拟地址对应于物理地址 0x12340000 到 0x12340FFFF”;如果软件尝试从虚拟地址 0x00000468 读取 4 个字节,那么 CPU 实际上会从物理地址 0x12340468 读取 4 个字节。

通常一切都受到虚拟->物理转换的影响(CPU 访问描述转换的数据结构时除外)。此外,通常会在 CPU 中内置某种翻译缓存,以帮助减少所涉及的开销。

【讨论】:

  • 好吧,考虑到主题的深度,谈论“一些做这个或那个的数据结构”几乎没有任何帮助。我想要一个具体的例子来说明操作系统和硬件级别发生的事情。
  • @devoured elysium:你想用什么 CPU 来做一个具体的例子?
  • 基本上,任何东西,只要它具有描述性并逐步说明实际发生的情况。恐龙书中的所有网络文章似乎都略过了这一部分。
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多