【问题标题】:Memory segmentation?内存分割?
【发布时间】:2018-11-01 01:15:49
【问题描述】:

我现在了解了虚拟内存的工作原理以及设置此虚拟内存的原因。但是,几天前,我遇到了将地址空间分成datatext 之类的段的内存分段。我找不到任何解释内存分段的清晰、明确的资源(至少对我而言)。例如,我想知道,

什么负责将地址空间分成段?

它究竟是如何工作的?比如段是如何转换为物理地址的,什么检查某个段内的地址是否被访问过?

我找到了this wiki article,但它并没有真正回答这些问题。

【问题讨论】:

    标签: memory operating-system


    【解决方案1】:

    术语“段”至少出现在两个不同的内存上下文中。

    在过去,分段是用于内存保护的方法。英特尔芯片在过时后继续使用细分市场数十年。 Intel 终于在 64 位模式下放弃了对段的使用,但它们仍然以退化的形式存在,并且仍然存在于 32 位模式中。

    这是维基百科链接中描述的“分段”类型。

    “代码”和“数据”类型的分割是完全不同的。另一个术语是“程序部分”。

    当您链接代码时,链接器通常会将具有相同属性的内存分组到“程序段”(也称为“段”)中。通常你会有以下记忆:

    1. 只读/执行(代码)
    2. 读/写并初始化为零
    3. 读/写并初始化为指定值
    4. 只读

    为了控制相关内存的分组,链接器通常使用命名的段/程序段。默认情况下,链接器可以创建一个名为“代码”的程序段/段,并将所有可执行代码放在该段中。默认情况下,它会创建一个名为“Data”的段并将只读数据放在该段中。

    强大的链接器允许程序员覆盖这些。一些汇编语言和系统语言允许您指定程序部分。

    此上下文中的“Segments”仅存在于链接过程中。内存中没有标记为“代码”或“数据”的区域(除非您使用的是旧 Intel 系统)。

    什么负责将地址空间分成段?

    地址空间在现代系统(即 1970 年之后设计的,并非来自英特尔的系统)上不会分成第二种类型的段。一些令人困惑的书籍将此作为图表中的教学概念。一个进程可以(并且通常确实)有代码页和数据页。

    例如如何将段转换为物理地址,以及如何检查某个段中的地址是否已被访问?

    该问题与顶部描述的“细分”一词的使用有关。该转换是使用硬件寄存器完成的。

    【讨论】:

      【解决方案2】:

      好吧,老实说,我更喜欢您查阅具有基础知识和详尽材料的书籍,而不是阅读文章。因为,他们的内容是具体的,高于基本水平(对我来说)。

      您问题中的每个术语都是一个单独的主题,在下面的参考资料中有很好的描述。如果你真的想要答案和清晰的概念,那么你应该通过这个:

      阅读 Abraham Silberschatz 的“操作系统概念”。

      第 8 章:内存管理

      子主题:分页基本方法和硬件支持、Segmentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多