9

在研究操作系统时(主要以 Linux 为参考),有几点我在所研究的材料中没有得到很好的解释。

加载到内存中的程序通常被描述为被划分为文本、数据、堆栈等段,即使在像 Linux 这样的虚拟内存完全基于分页的操作系统的上下文中也是如此。是否只是程序而不是内存本身被称为分段?如果是这样,我发现术语令人困惑。

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

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

除了对上述问题的“是”/“否”回答之外,我对任何关于该主题的有见地的阐述感兴趣。

4

2 回答 2

5

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

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

您关于释放通过 sbrk 获得的内存的问题在这里得到解答:如何释放通过 sbrk() 获得的内存?

于 2012-02-27T09:44:03.710 回答
0

分段实际上是操作系统设计的问题,而不是架构上的问题。在平面模型中只有一个段地址,即 CS、DS、... 的值由操作系统固定,程序地址最大偏移 4GB(对于 32 位 CPU)。我不知道是否有这样的现代操作系统,但不仅可以有 4GB 地址空间,而且可以有 64TB (2^46) 地址空间 16 位用于段寄存器 + 32 位偏移。

于 2018-04-29T07:05:13.710 回答