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


10

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

我对小型CPU体系结构比较熟悉,在该体系结构中,任何汇编代码都可以访问所有内容。我不了解程序(内核)如何检测到此类恶意操作。


2
通常,MMU会确保您不能访问允许区域之外的内存。
ott--

1
好吧,MMU由程序集配置。因此,汇编代码可以更改MMU配置并访问其他内存页面,对吗?
nowox

仅当您以root身份运行代码时,这才是正确的。
ott--

2
您应该在其中了解页表和内核抽象。
Clarus

@ott:即使root也不能修改MMU(至少在Linux上不是)。只有内核可以。
Basile Starynkevitch 2015年

Answers:


12

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

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

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

某些虚拟地址根本没有映射,即MMU将其转换为特殊的“无此类地址”值。当处理器取消引用未映射的地址时,这将导致陷阱:处理器分支到内核代码中的预定义位置。有些陷阱是合法的。例如,虚拟地址可能对应于交换空间中的页面,在这种情况下,内核代码将从交换中加载页面内容,然后以重新执行内存访问指令的方式切换回原始程序。其他陷阱是不合法的,在这种情况下,进程会接收到一个信号,默认情况下该信号会立即杀死程序(如果没有,则跳转到程序中的信号处理程序:无论如何,内存访问指令均未完成)。


您能否指定语句“该地址由CPU根据MMU的内容进行解码”?正在运行的程序中是否存在用于解码地址的实际代码?还是当CPU访问一个地址时-对MMU的访问就完成了,MMU正确地转换/处理了该地址(对内存或高速缓存进行访问并返回结果,或者触发了内核过程)?因此,从微控制器/组件的角度来看,MMU是新的部分。CPU没有直接连接到内存,而是连接到MMU,并且在这里完成了虚拟内存抽象。
xealits 2015年

3
@xealits从虚拟地址到物理地址的转换是在MMU内部完成的,MMU是一个硬件电路。在程序或内核中没有执行此操作的代码。仅当程序尝试访问MMU条目显示“无效地址”的虚拟地址时,才在特殊情况下调用内核。内核还负责配置MMU使用的RAM中的寄存器和表。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.