我一直在努力理解虚拟内存,但是当我深入了解它的真实细节时,我感到很困惑。我理解(或者我觉得我这样做)虚拟内存是进程“认为”它有一定量内存分配给它的一种方式。虚拟地址空间被划分为相等大小的页面,物理存储器被划分为相等大小的帧,并且页面映射到帧。
但是......如果这发生了什么?在此图中,CPU正在运行程序P.这意味着P的一部分已经在物理内存中,对吗? (因为cpu只能访问物理/主内存)。那么CPU究竟指出了什么?我看到它是虚拟内存空间中的一个页面,所以就像这个页面代表什么?这是一个指令吗?我们是否正在将指令从虚拟内存移动到物理内存,以便更多的程序在物理内存中(直到那时才需要)?我离开了吗?有人可以向我解释一下吗?
答案 0 :(得分:4)
该图显示了将虚拟地址转换为物理地址的过程。
从Program P
到CPU的胖箭头表示程序被“送入”CPU。 1
CPU“指向”指令用来寻址程序P
中的内存位置的虚拟地址。它分为两部分:
p
):虚拟地址包含页面表的索引,该页面将页面映射到页面框架({{ 1}})。有关该机制的描述(包括多级分页),请阅读this。f
):如您所见,偏移量直接添加到物理地址,因为分页的最小可寻址单位是页,不是字节 最后,计算出的地址用于处理物理内存中的内存位置。
1 “fed”表示从二级存储器读取(发音为 red )到RAM并通过指令执行程序指令“。
答案 1 :(得分:1)
我不打算尝试理解该图表,因为它没有任何意义。
标题为" Paging"但该图表根本没有显示分页。
您缺少的是有两个步骤。首先是逻辑内存转换(图表有点,sorta)显示。
物理内存以一些固定大小的PAGE FRAMES排列(例如,1K,4K)。
每个进程都有一个LOGICAL ADDRESS SPACE,由与页面框架大小匹配的PAGES组成。
逻辑地址空间由操作系统管理的PAGE TABLE定义。页表将逻辑页面映射到物理页面框架。
如果有两个进程(X和Y),则进程X中的逻辑地址Q和地址Y在大多数情况下映射到不同的物理页面帧。
通常会有一系列分配给SYSTEM ADDRESS SPACE的逻辑地址。这些逻辑页面映射到所有进程的同一物理页面。
进程仅处理逻辑页面。不了解物理页面。程序计数器寄存器始终指逻辑地址。 CPU自动将逻辑页面转换为物理页面帧。翻译对流程完全透明。操作系统是唯一具有物理页面框架知识的东西,但它只管理页面表格; CPU进行翻译。
分页是不同但相关的。
当程序访问存储器地址时,CPU会尝试将其转换为页框内的物理地址。发生了几个步骤。
CPU找到所请求页面的页表条目。 页面可能根本没有页面表条目。该图显示了连续的逻辑到物理映射。这很少发生。逻辑地址空间通常具有有效页面的集群,它们之间存在间隙。如果地址没有页表条目,则CPU会触发异常。
CPU读取页表条目以确定它是否引用了有效的页框。 页面的条目可能尚未映射到逻辑地址空间(例如,第一页通常不映射到陷阱空指针错误)。如果页面尚未映射,则会触发异常。
CPU检查当前处理器模式是否允许访问。 可以为页面设置读/写/执行保护,并且可以通过模式限制访问(内核模式,用户模式或某些处理器中的某些其他模式)。 如果不允许访问,则CPU会触发异常。
[这里是分页的来源] CPU检查页面是否已映射到物理页面框架。如果不是,CPU将触发PAGE FAULT。操作系统通过查找页面存储在页面文件中的位置,将页面表映射到物理页面框架,将页面文件中的数据加载到内存中,然后重新启动指令来进行响应。
答案 2 :(得分:0)