什么是计算机科学中的分段和分页?

use*_*147 3 memory paging operating-system memory-segmentation

我用Google搜索了很长时间,但我仍然不明白它是如何工作的,因为大多数解释都是非常技术性的,没有任何插图可以让它更清晰.我的主要困惑是它与虚拟内存有什么不同?

我希望这个问题在这里有一个非常好的解释,以便其他提出相同问题的人可以在谷歌时找到它.

Auf*_*gel 6

我不得不承认,这两个概念在开始时看起来很复杂和相似.有时他们也会被混淆地教导.我认为可以在osdev.org上找到一个很好的参考:Segmentation Paging

为了完成,我也试着在这里解释一下,但我无法保证正确性,因为我已经开发了几个月的操作系统.

在旧的16位天分段

分段是这两个概念中较老的一个,在我看来,它更令人困惑.分段工作 - 如名称所示 - 分段.段是特定大小的连续内存块.要访问每个段内的内存,我们需要一个偏移量.这使得总共有两个地址组件,实际上存储在两个寄存器中.分割的一个想法是扩大仅具有16位寄存器的存储器.另一种是某种保护,但不像寻呼那样复杂.

因为我们现在使用两个寄存器来访问内存,所以我们可以将内存分成块 - 如上所述,即所谓的段.考虑1MB(2 ^ 20)的内存.这可以分成每个16字节的65536(2 ^ 16,因为16位寄存器)段.当然,我们还有16位寄存器用于偏移.用16位寻址16个字节是没用的,所以决定段可以重叠(我认为当时还有性能和编程原因).

以下公式用于通过分段访问1MB内存:

Physical address = (A * 0x10) + B
Run Code Online (Sandbox Code Playgroud)

这意味着该段将是偏移量的16倍.这也意味着可以通过多种方式访问​​地址0x0100,例如,通过A = 0x010和B = 0x0,还可以通过A = 0x0和B = 0x0100.

这是旧的16bit天的细分.

如果你看一下汇编程序或自己尝试一些东西,你会发现它们甚至在汇编程序中都有所谓的寄存器:CS和DS(代码段和数据段).

分段为32bit天

后来引入了一个所谓的全局描述表(GDT).这是一个全局表(在RAM中的特定位置),其中给出了段号和内存地址以及每个段的其他几个选项.这使我们更接近分页的概念,但它仍然不一样.

所以现在程序员自己可以决定段应该从哪里开始.一个新的概念也是在GDT中可以决定一个细分应该有多长.因此,不是每个段都必须是64kB长(2 ^ 16,因为16位寄存器),但是限制可以由程序员定义.您可以有重叠的段或纯粹的分隔段.

当现在访问A:B时(仍然有两个寄存器用于访问存储器),A将是GDT中的条目.因此,我们将在GDT中查找第A个条目,并查看该段开始的内存位置以及它的大小.然后我们检查B(偏移)是否在允许的内存区域内.

分页

现在,分页与新的分段方法没有太大差别,但在分页时,每个页面都有固定的大小.因此限制不再可编程,每页都有(当前)4kb.此外,与分段不同,逻辑地址空间可以是连续的,而物理地址不是连续的.

分页还使用表来查找内容,您仍然将逻辑地址拆分为多个部分.第一部分是页表中的条目号,第二部分是偏移量.但是,现在偏移量具有12位的固定长度以访问4kb.您还可以拥有两个以上的部分,然后将使用多个页面表.两级页表很常见,对于64位系统,我认为甚至三级页表也很常见.

结尾

我希望我能够至少解释一下,但我认为我的出版也令人困惑.最好的办法是深入研究内核编程,并尝试在启动操作系统时实现最基本的东西.然后你会发现一切,因为由于向后兼容性,一切仍然在我们的现代PC上.