Memory 什么是计算机科学中的分段和分页?
我在谷歌上搜索了很长一段时间,但我仍然不明白它是如何工作的,因为大多数解释都是非常技术性的,并且没有插图来让它更清楚。我的主要困惑是,它与虚拟内存有什么区别Memory 什么是计算机科学中的分段和分页?,memory,operating-system,paging,memory-segmentation,Memory,Operating System,Paging,Memory Segmentation,我在谷歌上搜索了很长一段时间,但我仍然不明白它是如何工作的,因为大多数解释都是非常技术性的,并且没有插图来让它更清楚。我的主要困惑是,它与虚拟内存有什么区别 我希望这个问题在这里有一个很好的解释,这样其他问同样问题的人可以在谷歌上找到它 我不得不承认,这两个概念在一开始看起来相当复杂和相似。有时,他们也被教得很混乱。我认为可以在osdev.org上找到一个很好的参考: 为了完整起见,我也会在这里解释,但我不能保证正确性,因为我已经有几个月没有开发操作系统了 16位旧数据的分割 分割是这两个概念中
我希望这个问题在这里有一个很好的解释,这样其他问同样问题的人可以在谷歌上找到它 我不得不承认,这两个概念在一开始看起来相当复杂和相似。有时,他们也被教得很混乱。我认为可以在osdev.org上找到一个很好的参考: 为了完整起见,我也会在这里解释,但我不能保证正确性,因为我已经有几个月没有开发操作系统了 16位旧数据的分割 分割是这两个概念中比较古老的一个,在我看来,它更令人困惑。分段工作-正如名字所说-分段。段是特定大小的连续内存块。要访问每个段中的内存,我们需要一个偏移量。这使得总共有两个地址组件,它们实际上存储在两个寄存器中。分段的一个想法是扩大只有16位寄存器的内存。另一种是某种保护,但不像寻呼那样复杂 因为我们现在使用两个寄存器来访问内存,所以我们可以将内存分为块——如上所述,即所谓的段。考虑1MB(2 ^ 20)的内存。这可以分成每16字节的65536(2^16,因为16位寄存器)段。当然,偏移量也有16位寄存器。用16位寻址16字节是非常无用的,所以决定了段可以重叠(我认为这在当时也有性能和编程方面的原因) 以下公式用于通过分段访问1MB内存:
Physical address = (A * 0x10) + B
这意味着该段将是偏移的16倍。这也意味着地址0x0100可以通过多种方式访问,例如通过A=0x010和B=0x0,但也可以通过A=0x0和B=0x0100
这是旧16位时代的分割
如果您查看汇编程序或自己尝试一些东西,您会发现它们甚至在汇编程序中有所谓的寄存器:CS和DS(代码段和数据段)
32位天内的分段
后来引入了一个所谓的全局描述符表(GDT)。这是一个全局表(在RAM中的特定位置),其中给出了每个段的段号、内存地址和几个其他选项。这使我们更接近分页的概念,但它仍然不一样
所以现在程序员自己可以决定段应该从哪里开始。一个新的概念是,在GDT中,可以决定一个段应该有多长。因此,不是每个段都必须是64kB长(2^16,因为有16位寄存器),但是限制可以由程序员定义。可以有重叠的线段,也可以是完全分离的线段
现在访问A:B时(仍然有两个用于访问内存的寄存器),A将是GDT中的条目。因此,我们将在GDT中查找第A个条目,并查看段从哪个内存位置开始,以及它有多大。然后检查B(偏移量)是否在允许的内存区域内
寻呼
现在分页与较新的分段方法没有太大区别,但在分页时,每个页面都有一个固定的大小。因此,限制不再可编程,每个页面(当前)有4kb。此外,与at分段不同,逻辑地址空间可以是连续的,而物理地址不连续
分页还使用表来查找内容,您仍然可以将逻辑地址拆分为多个部分。第一部分是页表中条目的编号,第二部分是偏移量。但是,现在偏移量的固定长度为12位,以访问4kb。您也可以有两个以上的部分,然后将使用多页表。两级页面表非常常见,对于64位系统,我认为甚至三级页面表也很常见
结束
我希望我至少能解释一下,但我认为我的解释也令人困惑。最好的办法是深入内核编程,并在引导操作系统时尝试实现最基本的东西。然后你会发现一切,因为由于向后兼容,一切都仍然在我们的现代PC上。我指示你
及
分割正在逐渐消失。我怀疑将来寻呼也会如此
编辑:让我补充一点澄清
分段和分页是内存管理的两种不同方式,但它们通常做两件事。冒着过分简化的风险: