zoukankan      html  css  js  c++  java
  • MMU

    现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制

    这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持

    ps:MMU是设计在CPU内部的。

    引入两个概念,虚拟地址和物理地址

    如果处理器没有MMU

    或者有MMU但没有启用

    CPU执行单元发出的内存地址将直接传到芯片引脚上

    被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收

    这称为物理地址(Physical Address,以下简称PA)

    如果是32位处理器,则内地址总线是32位的,与CPU执行单元相连,而经过MMU转换之后的外地址总线则不一定是32位的。也就是说,虚拟地址空间和物理地址空间是独立的,32位处理器的虚拟地址空间是4GB,而物理地址空间既可以大于也可以小于4GB

    MMU将VA映射到PA是以页(Page)为单位的

    32位处理器的页尺寸通常是4KB

    例如,MMU可以通过一个映射项将VA的一页0xb7001000~0xb7001fff

    映射到PA的一页0x2000~0x2fff

    如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地址是0x2008

    物理内存中的页称为物理页面或者页帧(Page Frame)。

    虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页表(Page Table)来描述的

    页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA。

    ps:页表有点像 VA 的户口本

    操作系统和MMU是这样配合的:
    1. 操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,然后用指令设置MMU,告诉MMU页表在物理内存中的什么位置。
    2. 设置好之后,CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作,地址转换操作由硬件自动完成,不需要用指令控制MMU去做。
    我们在程序中使用的变量和函数都有各自的地址,程序被编译后,这些地址就成了指令中的地址,指令中的地址被CPU解释执行,就成了CPU执行单元发出的内存地址,所以在启用MMU的情况下,程序中使用的地址都是虚拟地址,都会引发MMU做查表和地址转换操作

    那为什么要设计这么复杂的内存管理机制呢?多了一层VA到PA的转换到底换来了什么好处?All problems incomputer science can be solved by another level of indirection.还记得这句话吗?多了一层间接必然是为了解决什么问题的

    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在产生中断或异常时不仅会跳转到中断或异常服务程序

    还会自动切换模式

    从用户模式切换到特权模式

    因此从中断或异常服务程序可以跳转到内核代码中执行

    事实上

    整个内核就是由各种中断和异常处理程序组成的

  • 相关阅读:
    全排列算法(java实现) 组合算法实现
    int -2147483648 ----- 2147483647
    Gradel 多渠道打包 代码混淆
    Android开发环境搭建
    自定义相册、九宫格显示图片
    新技术:retrofit
    新技术:dagger
    主流架构:MVVP
    GreenDao3.2的使用
    第三方框架:EventBus
  • 原文地址:https://www.cnblogs.com/Cheetos/p/5336539.html
Copyright © 2011-2022 走看看