内核如何防止恶意程序读取所有物理 RAM?

内核如何防止恶意程序读取所有物理 RAM?

如果我编写一个程序尝试读取每个可能地址的内存,并在“完整”Unix 上运行它,它将无法访问所有物理 RAM。但是操作系统如何阻止它这样做呢?

我更熟悉小型 CPU 架构,其中任何汇编代码都可以访问所有内容。我不明白程序(内核)如何检测此类恶意操作。

答案1

阻止错误内存访问的不是内核,而是 CPU。内核的作用只是正确配置CPU。

更准确地说,防止错误内存访问的硬件组件是内存管理单元。当程序访问某个内存地址时,CPU会根据MMU的内容对该地址进行解码。 MMU建立从虚拟地址到物理地址的转换:当CPU在某个虚拟地址处进行加载或存储时,它根据MMU内容计算出相应的物理地址。内核以这样的方式设置 MMU 配置,即每个程序只能访问它有权访问的内存。其他程序的内存和硬件寄存器根本没有映射到程序的内存中:这些物理地址在该程序的 MMU 配置中没有相应的虚拟地址。

在不同进程之间进行上下文切换时,内核会修改 MMU 配置,以便它包含新进程所需的转换。

有些虚拟地址根本没有映射,即MMU 将它们转换为特殊的“无此地址”值。当处理器取消引用未映射的地址时,这会导致陷阱:处理器分支到内核代码中的预定义位置。有些陷阱是合法的,但也有一些是合理的。例如,虚拟地址可以对应于位于交换空间,此时内核代码会从swap中加载页面内容,然后切换回原来的程序,再次执行内存访问指令。其他陷阱不合法,在这种情况下,进程会收到信号默认情况下,它会立即终止程序(如果没有分支到程序中的信号处理程序:在任何情况下,内存访问指令都没有完成)。

相关内容