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

Operating system 现代操作系统中的内存分割,operating-system,virtual-memory,memory-segmentation,Operating System,Virtual Memory,Memory Segmentation,在学习操作系统(主要以Linux为参考)时,我发现在我所学习的材料中有几点没有得到很好的解释 加载到内存中的程序通常被描述为被划分为文本、数据、堆栈等段,即使在Linux这样的操作系统中,虚拟内存完全基于分页。是否只是程序本身,而不是被称为分段的内存本身?如果是这样的话,我觉得术语令人困惑 我看到malloc可以在Linux中使用调用'sbrk'来实现,该调用增加了数据段的大小。同样,这个“数据段”是否只是一个按惯例用于数据的内存区域,而不是一个“真实”段?(另外一个问题:“sbrk”似乎不能减

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

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

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

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

除了上述问题的“是”/“否”答案外,我对这一主题的任何有见地的阐述都感兴趣。

在“数据段”中的段与硬件段无关,硬件段与现代操作系统几乎没有关联(即,分页方面的冗余)它依靠分页来实现虚拟内存。与分页相比,段也有严重的缺点(例如,段中连续的内存必须是物理上连续的),而没有任何好处。用户空间程序的“段”字面上是指进程虚拟空间的连续部分

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


您关于释放通过sbrk获得的内存的问题在这里得到了回答:

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

还有
brk
,可以将程序中断设置为较低的值。这些段被划分为多个页面,每个页面都可以是只读的或不执行的,文本段和ro数据段通常都是这样设置的。谢谢您的回答。我们没有办法从页面分割中获益吗?在我看来,让实际段中的段具有自己的地址空间将简化内存管理,并消除堆栈和数据段相互接触的可能性。段处理可以由编译器/链接器处理。无论如何,我认为在数据段等中使用“段”一词只会引起混淆。我想我应该在一些维基百科页面上添加一些消除歧义的注释:)@Gnurou我想你弄错了。x86段是在线性(即虚拟)地址空间中定义的,这意味着分页在段之后。reima:你是对的,谢谢你指出这一点。删除这些评论。