由于在我的脑海中一直存在虚拟内存的想法,我对纯分段有点困惑。
但据我了解,纯分段也是想象一个虚拟地址空间,分成全部加载到 RAM 中的段。
带分段的虚拟内存的区别在于,可能有一些段不在 RAM 中。
它是否正确?
我补充一个问题:分段结合分页和两级分页之间有实际区别吗?除了分段方法的“限制”保护之外,它是相同的。还是有别的区别?
由于在我的脑海中一直存在虚拟内存的想法,我对纯分段有点困惑。
但据我了解,纯分段也是想象一个虚拟地址空间,分成全部加载到 RAM 中的段。
带分段的虚拟内存的区别在于,可能有一些段不在 RAM 中。
它是否正确?
我补充一个问题:分段结合分页和两级分页之间有实际区别吗?除了分段方法的“限制”保护之外,它是相同的。还是有别的区别?
不,这是不正确的。例如,在 x86 上,分段使用由两部分组成的“远”指针:段选择器(加载到段寄存器,例如 DS)和段中的偏移量。段偏移总是从 0 开始。CPU 使用段选择器来查找包含段的 LINEAR 基地址、长度和访问权限的段描述符。所有访问都经过长度检查;如果您尝试访问超出段限制或无效访问的内存(例如,写入只读段),CPU 将产生一般保护故障。
由于段地址始终从零开始,并且段基址隐含在段选择器中,因此操作系统可以移动段并整理内存,而不会影响使用该数据的程序。(与“平面”内存模型对比,如果你移动一些数据,你还必须更新所有指向它的指针。)
现在,当分页被禁用时,LINEAR 段的基地址就是它的物理内存地址。启用分页后,对段数据的所有访问都由 MMU 照常转换。
如果您在这个级别上认真理解内存管理,可以通过阅读Silberschatz、Galvin 和 Gagne的操作系统概念找到一个很好的解释。您应该能够找到便宜的旧版本。