MMU原理

一、介绍

现代操作系统普遍采用虚拟内存管理(Virtual Memory Management) 机制,这需要处理器中
的MMU(Memory Management Unit,内存管理单元) 提供支持。它是一种负责处理CPU的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换、内存保护、中央处理器高速缓存的控制,

二、工作原理

首先引入两个概念,虚拟地址和物理地址。如果处理器没有MMU,或者有MMU但没有启
用, CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA) ,如下图所示



​如果处理器启用了MMU, CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称
为虚拟地址(Virtual Address,以下简称VA) ,而MMU将这个地址翻译成另一个地址发到CPU芯
片的外部地址引脚上,也就是将VA映射成PA,如下图所示。

 如果是32位处理器,则内地址总线是32位的,与CPU执行单元相连(图中只是示意性地画了4条地址线),而经过MMU转换之后的外地址总线则不一定是32位的。也就是说,虚拟地址空间和物理地址空间是独立的, 32位处理器的虚拟地址空间是4GB,而物理地址空间既可以大于也可以小
于4GB。(很好理解,电脑的内存条可以是8G,也可以是4G,甚至2G)

MMU将VA映射到PA是以页(Page) 为单位的, 32位处理器的页尺寸通常是4KB。例如, MMU可以通过一个映射项将VA的一页0xb7001000~0xb7001fff映射到PA的一页0x2000~0x2fff,如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地址是0x2008。物理内存中的
页称为物理页面或者页帧(Page Frame) 。虚拟内存的哪个页面映射到物理内存的哪个页帧是通
过页表(Page Table) 来描述的,页表保存在物理内存中, MMU会查找页表来确定一个VA应该映射到什么PA。

操作系统和MMU是这样配合的:
1. 操作系统在初始化或分配、释放内存时会执行一些指令,在物理内存中填写页表,然后用指令设置MMU,告诉MMU,页表在物理内存中的什么位置。
2. 设置好之后, CPU每次执行访问内存的指令,都会自动引发MMU做查表和地址转换操作,地址
转换操作由硬件自动完成,不需要用指令控制MMU去做。

我们在程序中使用的变量和函数都有各自的地址,程序被编译后,这些地址就成了指令中的地址,指令中的地址被CPU解释执行,就成了CPU执行单元发出的内存地址,所以在启用MMU的情况
下,程序中使用的地址都是虚拟地址,都会引发MMU做查表和地址转换操作。

三、MMU如何知道页表在哪

前面说页表存储在物理内存中,那么MMU怎么知道这个页表在内存中的具体地址呢?通常CPU会提供一个页表基址寄存器给操作系统使用,用于给MMU指示页表的基地址。不同处理器架构对应的寄存器也不一样:

x86:CR3(Control Register 3)

ARM-v8:系统寄存器TTBR(Translation Table Base egister)

RISC-V:SATP(Supervisor Address Translation and Protection)

页表基址寄存器存储了第一级页表的基地址,通过访问该寄存器,就能知道页表在那个位置。

四、内存保护

MMU除了做地址转换之外,还提供内存保护机制。各种体系结构都有用户模式(User Mode) 和
特权模式(Privileged Mode) 之分,操作系统可以在页表中设置每个内存页面的访问权限,有些页面不允许访问,有些页面只有在CPU处于特权模式时才允许访问,有些页面在用户模式和特权模式都可以访问,访问权限又分为可读、可写和可执行三种。

这样设定好之后,当CPU要访问一个VA时, MMU会检查CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令,如果和操作系统设定的页面权限相符,就允许访问,把它转换成PA,否则不允许访问,产生一个异常(Exception) 。异常的处理过程和中断类似,不同的是中断由外部设备产生而异常由CPU内部产生,中断产生的原因和CPU当前执行的指令无关,而异常的产生就是由于CPU当前执行的指令出了问题,例如访问内存的指令被MMU检查出权限错误,除法指令的除数为0等都会产生异常。

通常操作系统把虚拟地址空间划分为用户空间和内核空间,例如x86平台的Linux系统虚拟地址空间
是0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用户空间。

后1GB(0xc0000000~0xffffffff)是内核空间。用户程序加载到用户空间,在用户模式下执行,不
能访问内核中的数据,也不能跳转到内核代码中执行,这样可以保护内核。

如果一个进程访问了非法地址,顶多这一个进程崩溃,而不会影响到内核和整个系统的稳定性。 CPU在产生中断或异常时不仅会跳转到中断或异常服务程序,还会自动切换模式,从用户模式切换到特权模式,因此从中断或异常服务程序可以跳转到内核代码中执行。事实上,整个内核就是由各种中断和异常处理程序组成的。

总结一下:在正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序。
 

五、段错误

段错误我们已经遇到过很多次了,它是这样产生的:
1. 用户程序要访问的一个VA,经MMU检查无权访问。
2. MMU产生一个异常, CPU从用户模式切换到特权模式,跳转到内核代码中,执行异常服务程
序。
3. 内核把这个异常解释为段错误,把引发异常的进程终止掉。
 

参考:

Linux原理篇——MMU工作原理_会飞的鱼的技术博客_51CTO博客

https://zhuanlan.zhihu.com/p/678338947

MMU工作原理-优快云博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值