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