在研究操作系统(主要以Linux作为参考)时,我在研究的材料中找不到很好的解释。
加载到内存中的程序通常被描述为分为文本,数据,堆栈等段,甚至在Linux等操作系统的上下文中,其中虚拟内存完全基于分页。它只是程序,而不是被称为分段的内存本身吗?如果是这样,我发现术语令人困惑。
我看到malloc可以在Linux中使用调用'sbrk'来实现,这会增加数据段的大小。同样,这个“数据段”是否只是按惯例用于数据的内存区域而不是“真实”段? (额外的问题:'sbrk'似乎无法减小'段'的大小。这是否意味着进程永远不会释放内存到操作系统而不是退出?)
此外,我有兴趣了解为什么现代操作系统似乎不使用(分页)分段。它不会阻止某些类型的攻击使代码驻留在它自己的受保护段中,从而提高安全性吗?另一方面,这会使... JIT编译不可能/困难?
除了上述问题的“是”/“否”答案之外,我对这个主题的任何有见地的阐述感兴趣。
提前谢谢。
答案 0 :(得分:4)
“数据段”中的段与硬件分段无关,硬件分段是与现代操作系统(即,关于分页的冗余)几乎没有关系的特征,其依赖于分页来实现虚拟存储器。与寻呼相比,段也具有严重的缺点(例如,段中的连续存储器必须是物理上连续的)而没有任何益处。用户空间程序的“段”,字面意思是该过程的虚拟空间的连续部分。
许多架构不再具有分段功能。在x86上,分段只是一个历史有效载荷,并且设置为具有覆盖整个地址空间的代码和数据段,因为无法绕过分段。
有关释放通过sbrk获取的记忆的问题,请在此处解答:How do I free memory obtained by sbrk()?
答案 1 :(得分:0)
分段实际上是操作系统设计的一个问题,而不是 建筑。在平面模型中,只有一个段地址,即CS,DS,...的值由操作系统修复,程序地址最大为4GB偏移(对于32位CPU)。我不知道是否有这样的现代操作系统,但有可能不仅有4GB的地址空间,而且64TB(2 ^ 46)地址空间16位用于段寄存器+ 32位偏移。