Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 什么是计算机科学中的分段和分页?_Memory_Operating System_Paging_Memory Segmentation - Fatal编程技术网

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上。

我指示你

分割正在逐渐消失。我怀疑将来寻呼也会如此

编辑:让我补充一点澄清

分段和分页是内存管理的两种不同方式,但它们通常做两件事。冒着过分简化的风险:

  • 分段允许进程访问超出自然指针大小所允许的内存

  • 分页允许进程访问超过系统物理支持的内存

  • 部分:

    PDP-11是一个16位系统。这允许寻址64K内存。后来的PDP-11系统的内存比这多得多。一个进程可以将不同的物理内存段映射到该64K内存中。一个进程只能访问64K内存,但它可以更改在该64K内存中可以访问的内存

    8086及其后继者将分段技术带入了一门高级艺术。使用更复杂的基址寄存器系统,进程可以访问更大的内存区域

    寻呼: 是一种系统,在该系统中,进程可以看到被划分为页的连续(或相对如此)内存地址范围。例如,VAX处理器有32位地址(理论上允许访问4GB内存),而计算机通常有8、16、32MB内存。一个进程可以访问比系统实际拥有的内存多得多的内存(加上多个进程)

    这些系统为进程提供了一个连续的内存范围(虚拟内存),分为页(大约512-2048字节)