【发布时间】:2018-11-01 01:15:49
【问题描述】:
我现在了解了虚拟内存的工作原理以及设置此虚拟内存的原因。但是,几天前,我遇到了将地址空间分成data 和text 之类的段的内存分段。我找不到任何解释内存分段的清晰、明确的资源(至少对我而言)。例如,我想知道,
什么负责将地址空间分成段?
它究竟是如何工作的?比如段是如何转换为物理地址的,什么检查某个段内的地址是否被访问过?
我找到了this wiki article,但它并没有真正回答这些问题。
【问题讨论】:
我现在了解了虚拟内存的工作原理以及设置此虚拟内存的原因。但是,几天前,我遇到了将地址空间分成data 和text 之类的段的内存分段。我找不到任何解释内存分段的清晰、明确的资源(至少对我而言)。例如,我想知道,
什么负责将地址空间分成段?
它究竟是如何工作的?比如段是如何转换为物理地址的,什么检查某个段内的地址是否被访问过?
我找到了this wiki article,但它并没有真正回答这些问题。
【问题讨论】:
术语“段”至少出现在两个不同的内存上下文中。
在过去,分段是用于内存保护的方法。英特尔芯片在过时后继续使用细分市场数十年。 Intel 终于在 64 位模式下放弃了对段的使用,但它们仍然以退化的形式存在,并且仍然存在于 32 位模式中。
这是维基百科链接中描述的“分段”类型。
“代码”和“数据”类型的分割是完全不同的。另一个术语是“程序部分”。
当您链接代码时,链接器通常会将具有相同属性的内存分组到“程序段”(也称为“段”)中。通常你会有以下记忆:
为了控制相关内存的分组,链接器通常使用命名的段/程序段。默认情况下,链接器可以创建一个名为“代码”的程序段/段,并将所有可执行代码放在该段中。默认情况下,它会创建一个名为“Data”的段并将只读数据放在该段中。
强大的链接器允许程序员覆盖这些。一些汇编语言和系统语言允许您指定程序部分。
此上下文中的“Segments”仅存在于链接过程中。内存中没有标记为“代码”或“数据”的区域(除非您使用的是旧 Intel 系统)。
什么负责将地址空间分成段?
地址空间在现代系统(即 1970 年之后设计的,并非来自英特尔的系统)上不会分成第二种类型的段。一些令人困惑的书籍将此作为图表中的教学概念。一个进程可以(并且通常确实)有代码页和数据页。
例如如何将段转换为物理地址,以及如何检查某个段中的地址是否已被访问?
该问题与顶部描述的“细分”一词的使用有关。该转换是使用硬件寄存器完成的。
【讨论】:
好吧,老实说,我更喜欢您查阅具有基础知识和详尽材料的书籍,而不是阅读文章。因为,他们的内容是具体的,高于基本水平(对我来说)。
您问题中的每个术语都是一个单独的主题,在下面的参考资料中有很好的描述。如果你真的想要答案和清晰的概念,那么你应该通过这个:
阅读 Abraham Silberschatz 的“操作系统概念”。
第 8 章:内存管理
子主题:分页基本方法和硬件支持、Segmentation
【讨论】: