Operating system MMU是协调操作系统和物理内存之间的一切,还是只是一个地址转换器?

Operating system MMU是协调操作系统和物理内存之间的一切,还是只是一个地址转换器?,operating-system,virtual-memory,Operating System,Virtual Memory,我试图理解当我们想给一个特定的虚拟内存地址赋值时,操作系统是如何工作的 我的第一个问题是MMU是否处理CPU和RAM之间的所有事情。这是真的吗?从维基百科上可以看出,我可以这么说: 一种内存管理单元(MMU),有时称为分页内存 管理单元(PMMU)是一台计算机 硬件组件负责 处理对请求的内存的访问 由中央处理器控制 如果是这样的话,人们如何告诉MMU我想要得到8个字节,例如64或128个字节?写作怎么样 如果不是这样,我猜MMU只是将虚拟地址转换为物理地址 当MMU检测到我们称之为页面错误时会发

我试图理解当我们想给一个特定的虚拟内存地址赋值时,操作系统是如何工作的

我的第一个问题是MMU是否处理CPU和RAM之间的所有事情。这是真的吗?从维基百科上可以看出,我可以这么说:

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

如果是这样的话,人们如何告诉MMU我想要得到8个字节,例如64或128个字节?写作怎么样

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

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


感谢

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

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

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

吞噬极乐世界

我将尝试一个接一个地回答你们的问题,但请注意,让你们掌握操作系统课程或计算机体系结构入门课程的教科书可能是个好主意

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映射,所以它会设置一个位来指示它无效。硬件的编程方式是,当它在访问时看到这个无效位时,它会生成一个异常