为什么进程的虚拟地址空间中有漏洞

时间:2018-12-11 23:53:40

标签: linux process linux-kernel virtual-memory

我的教科书说,一个虚拟地址的空间很大 没有映射到任何有意义的数据的过程。但是,当我们生成一个执行目标文件时,一切都已确定 例如.text,.data,共享对象等,唯一可能需要留有空隙的动态事物是堆栈。那么其他空隙来自何处?为什么我们不压缩所有内容,只为堆栈留出空隙? enter image description here

enter image description here

另一个问题是,在第二张图片上,未分配的VM页面和未分配的页面有什么区别?

2 个答案:

答案 0 :(得分:0)

在第一张图片中,虚拟地址空间中存在三个间隙。因为有用,所以在0处有孔。编程错误经常不小心将小整数用作地址,因此,如果地址未映射到地址空间中,则MMU硬件可以检测到它。

最后一个漏洞是因为我们没有用完所有地址空间!

共享库之前的漏洞可能有几个原因。在许多体系结构上,库有一个“首选”地址要加载。将其放置在其他位置需要重新定位工作,并且可能需要一些未共享的页面。与所有系统在可预测的地址处具有库X相比,“任意”定位它们会使某些黑客更加困难。最后,您忘记了堆-动态分配内存的区域,通常放在目标文件分配的数据之后。

在第二张图中,“未分配的VM页”似乎表示页表中没有任何空间。 “未分配的页面”在页面表中具有条目,因此从某种意义上说,它们与现有的关系有点紧密。不过,我不确定作者想提出什么观点。这对执行程序本身并不重要。

为什么不压缩地址空间:它什么也得不到。稀缺资源是实际内存,而不是(通常)压缩的地址空间。能够故意有漏洞是一个积极的好处,以便在必要时可以扩展数据。

答案 1 :(得分:0)

您的图表过于简化。这是不正确的:

  

但是当我们生成一个执行目标文件时,所有内容都被确定,例如.text,.data,共享对象等,

诸如文本和数据之类的东西是可执行文件中的集合。内存中不存在。

在64位系统中,您拥有超过10亿千兆字节的可寻址空间。现有的应用程序都无法使用那么多的内存,因此地址空间中会出现漏洞。

孔用于保护。大多数系统都未映射最低页面,从而为空指针创建陷阱。一些系统在堆栈周围放置间隙以捕获上溢和下溢。

有一系列系统地址。这些通常是保留的,但是有很多未使用的空间。这会造成漏洞。

如果您尝试保持连续的可用地址范围,则会产生必须保持内存连续的问题。这就产生了各种各样的分配问题。

  

另一个问题是,在第二张图片上,未分配的VM页面和未分配的页面有什么区别?

我怀疑他们试图说明未映射到地址空间的页面(即完全无效的页面)和分页到辅助存储的页面(即将触发页面的页面)之间的区别如果访问失败)。