2

I Googled for a long time but I still don't understand how it works as most of the explanation are very technical and there are no illustrations to make it clearer. My primary confusion is that what is its'difference with virtual memory?

I hope this question will have a very good explanation here so that other people who ask the same question can find it here when they Google it.

4

2 回答 2

7

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

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

旧 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'th 条目,并查看该段从哪个内存位置开始以及它有多大。然后我们检查 B(偏移量)是否在允许的内存区域内。

寻呼

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

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

结尾

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

于 2014-05-10T19:56:14.603 回答
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 位处理器模式消除了这一点。

于 2014-05-11T00:44:06.977 回答