我用Google搜索了很长时间,但我仍然不明白它是如何工作的,因为大多数解释都非常技术性,而且没有任何插图可以让它更清晰。我的主要困惑是它与虚拟内存有什么不同?
我希望这个问题在这里有一个非常好的解释,以便其他提出相同问题的人可以在谷歌时找到它。
答案 0 :(得分:6)
我必须承认,这两个概念在开始时看起来非常复杂和相似。有时他们也会被混淆地教导。我认为可以在osdev.org上找到一个很好的参考:Segmentation Paging
为了完成,我也会尝试在这里解释一下,但我无法保证正确性,因为我已经开发了几个月的操作系统。
分割是这两个概念中较老的一个,在我看来更令人困惑。分段工作 - 顾名思义 - 细分。段是特定大小的连续内存块。要访问每个细分中的内存,我们需要偏移。这使得总共有两个地址组件,实际上存储在两个寄存器中。分割的一个想法是扩大仅具有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(代码段和数据段)。
后来推出了一个所谓的全局描述表(GDT)。这是一个全局表(在RAM中的特定位置),其中给出了段号和内存地址以及每个段的其他几个选项。这使我们更接近分页的概念,但它仍然不一样。
所以现在程序员自己可以决定段应该从哪里开始。一个新的概念也是在GDT中可以决定一个细分应该有多长。因此,不是每个段必须是64kB长(2 ^ 16,因为16位寄存器),但是限制可以由程序员定义。您可以有重叠的段或纯粹的分离段。
现在访问A:B时(仍然有两个寄存器用于访问存储器),A将是GDT中的条目。因此,我们将在GDT中查找第A个条目,并查看该段开始的内存位置以及它的大小。然后我们检查B(偏移)是否在允许的内存区域内。
现在,分页与新的分段方法没有什么不同,但在分页时,每个页面都有固定的大小。因此限制不再可编程,每页都有(当前)4kb。此外,与分段不同,逻辑地址空间可以是连续的,而物理地址不是连续的。
Paging还使用表来查找内容,您仍然将逻辑地址拆分为多个部分。第一部分是页表中的条目号,第二部分是偏移量。但是,现在偏移量具有12位的固定长度以访问4kb。您还可以拥有两个以上的部分,然后将使用多个页面表。两级页面表非常常见,对于64位系统,我认为甚至三级页表也很常见。
我希望我能够至少解释一下,但我认为我的出版也令人困惑。最好的办法是深入研究内核编程,并尝试在启动操作系统时实现最基本的东西。然后你会发现一切,因为由于向后兼容性,一切仍然在我们现代的PC上。
答案 1 :(得分:2)
我指示你
http://en.wikipedia.org/wiki/Virtual_memory
和
http://en.wikipedia.org/wiki/Segmented_memory
细分已经开始消亡。我怀疑未来的分页也会如此。
编辑:让我添加澄清
分段和分页是内存管理的两种不同方法,但它们通常做两件事。冒着过于简单化的风险:
分段允许进程访问比自然指针大小允许的内存更多的内存。
分页允许进程访问比系统物理支持的内存更多的内存。
区隔:
PDP-11是一个16位系统。这允许寻址64K的内存。晚期的PDP-11系统拥有更多的内存。进程可以将不同的物理内存段映射到64K。一个进程只能访问64K的内存,但它可以改变它在64K内可以访问的内存。
8086和后继者将分段推向高端艺术。使用更复杂的基本寄存器系统,进程可以访问更大的内存区域。
页: 是一个系统,其中进程看到连续(或相对如此)的内存地址范围被分成页面。例如,VAX处理器具有32位地址(理论上允许访问4GB内存),而计算机通常具有8,16 32MB内存。进程可以访问比系统实际拥有的内存(加上多个进程)。
这些系统为进程(虚拟内存)提供了连续的内存范围,分为页面(大约512-2048字节),由一组表定义并映射到磁盘存储。如果进程访问了不在内存中的页面,则会触发硬件异常。操作系统将拦截该异常,分配新的物理内存页,然后从磁盘加载内存,然后重新启动指令。
如果操作系统需要更多内存来处理这些请求,它会将已经加载的内存分页。如果数据是只读的,通常这将从可执行映像加载,而不必分页。页面可能只是标记为无效。如果它是读/写内存,页面将被写入页面文件以便存储,直到再次需要为止。
32位英特尔芯片引入了一个奇特的系统,结合了分段和分页。细分用于数据保护。 64位处理器模式可以消除这种情况。