【问题标题】:What is segmentation and paging in Computer Science?什么是计算机科学中的分段和分页?
【发布时间】:2014-05-10 17:13:21
【问题描述】:

我用谷歌搜索了很长时间,但我仍然不明白它是如何工作的,因为大多数解释都是非常技术性的,并且没有插图可以更清楚地说明。我的主要困惑是它与虚拟内存有什么区别?

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

【问题讨论】:

标签: memory operating-system paging memory-segmentation


【解决方案1】:

我不得不承认,这两个概念一开始可能看起来相当复杂和相似。有时他们的教学也很混乱。我认为可以在 osdev.org 上找到一个很好的参考:SegmentationPaging

为了完整起见,这里我也试着解释一下,但我不能保证正确性,因为我已经有几个月没有开发操作系统了。

旧 16 位时代的分段

细分是这两个概念中较老的一个,在我看来,它更令人困惑。细分适用于 - 顾名思义 - segments。段是特定大小的连续内存块。要访问每个段内的内存,我们需要一个偏移量。这使得总共有两个地址分量,它们实际上存储在两个寄存器中。分段的一个想法是扩大只有 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'th 条目,并查看该段从哪个内存位置开始以及它有多大。然后我们检查 B(偏移量)是否在允许的内存区域内。

分页

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

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

结束

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

【讨论】:

    【解决方案2】:

    我指引你去

    http://en.wikipedia.org/wiki/Virtual_memory

    http://en.wikipedia.org/wiki/Segmented_memory

    细分开始消亡。我怀疑分页将来也会。

    编辑:让我补充说明

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

    1. 分段允许进程访问比自然指针大小允许的更多的内存。

    2. 分页允许进程访问比系统物理支持更多的内存。

    细分:

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

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

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

    这些系统为进程(虚拟内存)提供了连续范围的内存,这些内存分为页面(大约 512-2048 字节),由一组表定义并映射到磁盘存储。如果一个进程访问了一个不在内存中的页面,它就会触发一个硬件异常。操作系统会拦截该异常,分配新的物理内存页面,然后从磁盘加载内存,然后重新启动指令。

    如果操作系统需要更多内存来处理这些请求,它会调出它已经加载的内存。如果数据是只读的,通常会从可执行映像中加载,而不必换页。该页面可能被标记为无效。如果它是读/写内存,页面将被写入页面文件进行存储,直到再次需要。

    32 位英特尔芯片引入了一种结合了分段和分页的奇异系统。段用于数据保护。 64 位处理器模式消除了这一点。

    【讨论】:

    • 如果那篇文章那么容易理解,我就不会在这里问了 :(
    猜你喜欢
    • 1970-01-01
    • 2023-01-15
    • 2018-04-25
    • 2010-10-05
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2013-09-11
    相关资源
    最近更新 更多