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