dev*_*ium 5 operating-system virtual-memory
我想了解当我们想要为特定虚拟内存地址分配一些值时操作系统如何工作.
我的第一个问题是MMU是否处理CPU和RAM之间的所有内容.这是真的?从维基百科可以读到的内容,我会这样说:
存储器管理单元(MMU),有时称为分页存储器管理单元(PMMU),是负责处理对CPU请求的存储器的访问的计算机硬件组件.
如果是这种情况,那么如何告诉MMU我想获得8字节,64或128字节,例如?写作怎么样?
如果不是这样,我猜测MMU只是将虚拟地址转换为物理地址?
当MMU检测到我们称之为页面错误时会发生什么?我想它必须告诉CPU,以便CPU将页面本身从磁盘上加载,或者MMU能够做到这一点吗?
谢谢
小智 28
吞噬的极乐世界,
我会尝试逐一回答您的问题,但请注意,您可以将手册放在OS课程或介绍性计算机体系结构课程上.
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
Run Code Online (Sandbox Code Playgroud)
其中10是eax寄存器中的值.
2)在这种情况下,0xDEADBEEF是一个必须翻译的虚拟地址.大多数情况下,虚拟到物理地址转换将在称为转换后备缓冲区(TLB)的硬件结构中可用,它将非常快速地向我们提供此转换.通常,它可以在一个时钟周期内完成.如果翻译是在TLB中,称为TLB命中,执行可以立即继续(即,对应于0xDEADBEEF物理地址和10被送出到存储器控制器中的值将被写入).
3)但是,我们假设翻译在TLB中不可用(称为TLB未命中).然后我们必须在页表中找到翻译,页表是内存中的结构,其结构由硬件定义并由OS管理.它们只包含将虚拟地址映射到物理地址的条目(更准确地说,是虚拟页面编号到物理页面编号).但是这些结构也存在于内存中,所以必须有地址!硬件包含一个名为cr3的特殊寄存器,它包含当前页表的物理地址.我们可以将指数使用我们的虚拟地址此页表,因此在硬件发生在CR3值,加上了偏移计算的地址,并熄灭内存来获取页表项(PTE).这个PTE将(希望)包含与0xDEADBEEF对应的物理地址,在这种情况下,我们将此映射放在TLB中(因此我们不必再次遍历页表)并继续我们的方式.
4)但是哦不!如果0xDEADBEEF的页表中没有PTE怎么办?这是页面错误,这是操作系统发挥作用的地方.我们从页面表中获取的PTE存在,因为它是(让我们假设)一个有效的内存地址来访问,但操作系统还没有为它创建VA-> PA映射,所以它会有一点设置表明它无效.硬件以这样的方式编程:当它在访问时看到该无效位时,它产生异常,在这种情况下是页面错误.
5)异常导致硬件通过跳转到一个众所周知的位置来调用操作系统 - 一段称为处理程序的代码.可以有许多异常处理程序,页面错误处理程序就是其中之一.页面错误处理程序将知道导致错误的地址,因为它存储在某个寄存器中,因此将为我们的虚拟地址0xDEADBEEF创建一个新的映射.它将通过分配物理内存的空闲页面然后说"VA x和VA y之间的所有虚拟地址将映射到这个新分配的物理内存页面中的某个地址"来实现.0xDEADBEEF将在该范围内的某个位置,因此映射现在安全地存在于页表中,我们可以重新启动导致页面错误的指令(mov).
6)现在,当我们再次浏览页面表时,我们将找到一个映射,我们提取的PTE将有一个很好的物理地址,即我们要存储的地址.我们为内存控制器提供10值,我们就完成了!
缓存会改变这个游戏,但我希望这可以说明分页的工作原理.再次,查看一些OS /计算机体系结构书籍会对您有所帮助.我希望这很清楚.