此处解释了分页,幻灯片#6:
http://www.cs.ucc.ie/~grigoras/CS2506/Lecture_6.pdf
在我的讲义中,但我不能为我的生活理解它。我知道它是一种将虚拟地址转换为物理地址的方法。因此,磁盘上的虚拟地址被分成2 ^ k的块。在此之后我真的很困惑。有人可以用简单的语言向我解释一下吗?
答案 0 :(得分:11)
正如您所指出的,分页是一种虚拟内存。回答@John Curtsy提出的问题:它通常与虚拟内存分开覆盖,因为 其他类型的虚拟内存,尽管现在(迄今为止)分页是最常见的。
分页虚拟内存非常简单:您将所有物理内存分成多个大小相同的块(尽管在实践中选择两个或三个大小相当常见)。使块大小相等使它们可以互换。
然后你有解决。首先将每个地址分成两部分。一个是页面内的偏移量。您通常使用该部分的最低有效位。如果您使用(比方说)4K页面,则需要12位作为偏移量。使用(比方说)一个32位的地址空间,剩下20位。
从那里开始,事情真的比最初看起来简单得多。你基本上构建了一个小的“描述符”来描述每一页的内存。这将具有线性地址(客户端应用程序用于寻址该存储器的地址),以及存储器的物理地址以及存在位。 (至少通常)会有一些其他的东西,比如权限,以指示该页面中的数据是否可以被读取,写入,执行等。
然后,当客户端代码使用地址时,CPU首先从地址的其余部分分解页面偏移量。然后它接受线性地址的其余部分,并查看页面描述符以找到与该线性地址一致的物理地址。然后,为了寻址物理存储器,它使用物理地址的高20位和线性地址的低12位,它们一起构成了在处理器引脚上输出的实际物理地址,并从存储器芯片获取数据
现在,我们到达了获得“真正”虚拟内存的部分。当程序使用的内存大于实际可用内存时,操作系统会获取其中一些描述符的数据,并将其写入磁盘驱动器。然后清除该存储器页面的“Present”位。现在,内存的物理页面可以用于其他目的。
当客户端程序尝试引用该内存时,CPU会检查是否设置了当前位。如果不是,则CPU引发异常。当发生这种情况时,CPU释放一块物理内存,如上所述,从磁盘读回当前页面的数据,并使用它现在所在的物理页面的地址填充页面描述符。当它完成所有这一切后,它从异常中返回,并且CPU重新开始执行导致异常开始的指令 - 除了现在,设置了当前位,因此使用内存将起作用。
还有一个细节您可能需要知道:页面描述符通常排列在页面表中,而(重要的部分)您通常为系统中的每个进程分别设置一组页表(另一个用于操作系统内核本身)。为每个进程分别具有页表意味着每个进程可以使用相同的线性地址集,但这些地址根据需要映射到不同的物理地址集。您还可以通过创建包含相同物理地址的两个单独的页面描述符(每个进程一个)来将相同的物理内存映射到多个进程。大多数操作系统使用它,例如,如果您运行相同程序的两个或三个副本,它实际上只有一个副本的内存中该程序的可执行代码 - 但是它将有两组或三组页面描述符指向相同的代码,因此所有这些代码都可以使用它而无需为每个代码制作单独的副本。
当然,我正在简化很多 - 很多完整的(通常都是相当大的)书籍都是关于虚拟内存的。机器之间也有相当多的变化,添加了各种装饰,参数的微小变化(例如,页面是4K还是8K)等等。尽管如此,这至少是对所发生事情的核心的一般概念(并且它仍然处于足够高的水平以将关于同等地应用于ARM,x86,MIPS,SPARC等)。 p>
答案 1 :(得分:2)
简单地说,它是一种比地址空间通常允许的数据更多的方式。即,如果您有32位地址空间和4位虚拟地址,则可以保存(2 ^ 32)^(2 ^ 4)个地址(远远超过32位地址空间)。
答案 2 :(得分:-1)