8

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

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

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

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

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

当 MMU 检测到我们称之为页面错误时会发生什么?我想它必须告诉 CPU 以便 CPU 将页面本身从磁盘加载,或者 MMU 能够做到这一点吗?

谢谢

4

2 回答 2

36

吞噬极乐世界,

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

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

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

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

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

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

于 2011-02-04T07:19:16.170 回答
0

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

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

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

于 2011-01-27T02:53:51.313 回答