现代操作系统中的内存分割

Hal*_*ast 8 operating-system virtual-memory memory-segmentation

在研究操作系统(主要以Linux作为参考)时,我在研究的材料中找不到很好的解释.

加载到存储器中的程序通常被描述为被分成文本,数据,堆栈等的段,甚至在诸如Linux的操作系统的上下文中,其中虚拟存储器完全基于分页.它只是程序,而不是被称为分段的内存本身吗?如果是这样,我发现术语令人困惑.

我看到malloc可以在Linux中使用调用'sbrk'来实现,这会增加数据段的大小.同样,这个"数据段"是否只是按惯例用于数据的内存区域而不是"真实"段?(额外的问题:'sbrk'似乎无法减小'段'的大小.这是否意味着进程永远不会释放内存到操作系统而不是退出?)

此外,我有兴趣知道为什么现代操作系统似乎不使用(分页)分段.它不会阻止某些类型的攻击使代码驻留在它自己的受保护段中,从而提高安全性吗?另一方面,这会使JIT编译变得不可能/困难吗?

除了上述问题的"是"/"否"答案之外,我对任何有关该主题的深刻阐述感兴趣.

先感谢您.

Gnu*_*rou 5

“数据段”中的段与硬件分段无关,这是一个与依赖分页来实现虚拟内存的现代操作系统关系不大的功能(即相对于分页而言是冗余的)。与分页相比,段也有严重的缺点(例如,段中连续的内存必须是物理上连续的),而没有任何好处。用户空间程序的“段”字面意思是进程虚拟空间的连续部分。

许多架构不再有分段。在 x86 上,分段只是一个历史有效负载,并且被设置为具有覆盖整个地址空间的代码和数据段,因为分段无法被绕过。

您关于释放通过 sbrk 获得的内存的问题在这里得到解答:How do I free memory getting by sbrk()?