如果我编写一个程序试图在每个可能的地址读取内存,并且我在“完整”的 Unix 上运行它,它将无法访问所有物理 RAM。但是操作系统如何阻止它这样做呢?
我更熟悉小型 CPU 架构,其中任何一段汇编代码都可以访问所有内容。我不明白程序(内核)如何检测到这种恶意操作。
Gil*_*il' 12
阻止错误内存访问的不是内核,而是 CPU。内核的作用只是正确配置CPU。
更准确地说,防止错误内存访问的硬件组件是MMU。当程序访问一个内存地址时,CPU根据MMU的内容对该地址进行解码。MMU 建立了从虚拟地址到物理地址的转换:当 CPU 在某个虚拟地址进行加载或存储时,它会根据 MMU 的内容计算出相应的物理地址。内核以这样一种方式设置 MMU 配置,即每个程序只能访问它有权访问的内存。其他程序的内存和硬件寄存器根本没有映射到程序的内存中:这些物理地址在该程序的 MMU 配置中没有对应的虚拟地址。
在不同进程之间进行上下文切换时,内核会修改 MMU 配置,以便它包含新进程所需的转换。
一些虚拟地址根本没有映射,即 MMU 将它们转换为特殊的“无此类地址”值。当处理器取消引用一个未映射的地址时,这会导致一个陷阱:处理器分支到内核代码中的预定义位置。有些陷阱是合法的;例如,虚拟地址可能对应于交换空间中的页面,在这种情况下,内核代码将从交换中加载页面内容,然后以再次执行内存访问指令的方式切换回原始程序。其他陷阱是不合法的,在这种情况下,进程收到一个信号,默认情况下会立即终止程序(如果没有分支到程序中的信号处理程序:在任何情况下,内存访问指令都没有完成)。
| 归档时间: |
|
| 查看次数: |
2116 次 |
| 最近记录: |