以下内容是<<Linux c编程一站式学习>>的学习摘录与笔记。
首先是先了解一下什么是MMU((Memory Management Unit,), 及有和没有MMU的情况,为什么要有MMU
首先引入两个概念,虚拟地址和物理地址。如果处理器没有MMU, 或者有MMU但没有启用, CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA),如下图所示。
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称 为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA,如下图所示。
段错误我们已经遇到过很多次了,它是这样产生的:
1. 用户程序要访问的一个VA,经MMU检查无权访问。
2. MMU产生一个异常,CPU从用户模式切换到特权模式,跳转到内核代码中执行异常服务程序。
3. 内核把这个异常解释为段错误,把引发异常的进程终止掉。