1.物理地址/逻辑地址相互关系
1.系统位数、虚拟地址空间大小、虚拟地址总位数(按字节编址)三者等价,可以相互推出
2.一级页表情况下,页号和页表索引是同一概念:页号 + 页内偏移量 = 虚拟地址总位数;也是多级页表下最后一级的页表
3.二级页表情况下,顶级页表的页号为页目录号:页目录号 + 页号 + 页内偏移量 = 虚拟地址总位数
4.页目录表大小(顶级页表总占用空间)= 页目录号总个数(通过页目录号的位数推出) * 单个页目录项的长度(每个页目录项的大小相同)
5.逻辑页号/虚页号 = 页目录号 + 页号:总的虚页号用于查找TLB
①逻辑地址 = 逻辑页号 + 页内偏移量
②逻辑页号根据使用的是几级页表被拆分为几个部分,即一级页表情况下,逻辑页号 = 页号;二级页表情况下,逻辑页号 = 页号 + 页目录号
6.页内偏移量/页内地址、页面大小、页框大小三者等价
7.具体的地址(例如123456H)和被拆分成三部分的虚拟地址(12H、34H、56H)之间可以相互转化
8.页框号 + 页内偏移量 = 物理地址:
①查找根据逻辑地址TLB或者内存中的慢表的目的是得到物理地址的页框号
②查到物理地址的页框号后,根据逻辑地址中的页内偏移量可以拼接得到最终的物理地址
③逻辑地址到物理地址的转换过程中页内偏移量是不变的
9.页表大小(二级页表总占用空间)= 页表项总个数(通过页表的位数推出) * 单个页表项长度(每个页表项的大小相同)(与页目录项同理)
10.目标页表项的物理地址 = 页表的起始物理地址 + 页号 * 页表项长度:
①页表在内存中是连续存放的(类似数组),故它们可以根据页号和单个页表项长度找到目标页表项的物理地址(数组元素大小和数组下标)
②根据页表项的物理地址可以找到该页表项中的具体内容,根据具体内容答题
11.目标页目录项的物理地址 = 页目录的起始物理地址 + 页目录号 * 页目录项长度:找到该页目录项的具体内容后,可以根据10中关系再最终找到目标页表
2.存储系统
1.磁盘以块为单位
2.内存物理上被分为若干页框(考试中一般认为页框大小和磁盘块大小一致,但是现实中可能一致)
3.进程被分为若干页面,每个进程的页面被离散的放在内存中的页框中
4.CPU访问进程某个页面时需要查询TLB/慢表进行地址转换:
①进程的页面和页表项一一对应
②每个页表项中记录页号和实际物理地址的页框号的映射关系,以及是否有效(是否已经调入内存/是否缺页)
5.进程间有共享的页面(每个进程都有一个固定的地址部分映射到内核区的代码和内核数据,用于实现各种系统调用):
①当进程之间利用系统调用进行通信的时,进程A先通过系统调用(存放在内核代码区)将要通信的内容存放在内核数据区
②进程B再通过系统调用将存放在内核数据区的内容取出,并放入自己的数据区中(进程A和进程B的内核区映射到的是同一片主存地址空间)
6.进程的数据区由若干指令组成,执行指令时可能需要访问某个虚拟地址,CPU就会将虚拟地址从指令中拆分出来,并进行虚拟地址到物理地址的转换:
①使用虚拟地址中的虚拟页号查询TLB(TLB存放的是虚拟页号和物理地址页框号的映射关系)
②TLB命中(TLB中有和虚拟页号对应的表项)且有效位为1时:该情况下不可能发生缺页
(1)将该表项中存放的页框号和页内偏移量进行拼接得到物理地址
(2)根据物理地址中的页框号找到对应页框
(3)根据页内偏移量找到对应的具体数据,并取出该数据
③TLB命中但有效位为0,或者TLB未命中:
(1)根据页表始址寄存器中存放的内容(页表始址)得到存放该进程页表的页表始址(进程未运行,页表始址存放在PCB中;进程上处理机运行时,CPU将页表始址从PCB中取出并放入页表始址寄存器中)
(2)查询该页的页表项得到物理地址的页框号,并将该映射关系复制到TLB中:该页的页表项(记录放该页号和其实际主存中物理页框的映射关系)的地址 = 页表始址 + 页号 * 单个页表项大小(页表项采用连续存储的方式,占用一片连续的存储空间)
(3)根据页表项中记录的物理页框号和页内偏移量进行拼接,得到具体数据的物理地址,取出数据
④TLB未命中,且慢表命中但有效位为0,即发生缺页:
(1)发生缺页异常(页故障),操作系统检测到该异常后,会对该异常进行处理,即调页(读磁盘块),慢表中的页表项中保存着其外存地址,根据此外存地址将外存中的物理块(考试中默认大小与页相等)读入主存
(2)主存仍有空闲页框:该块调入主存的空闲页框中,并修改相应页表项
(3)主存没有空闲页框:先根据页面置换算法选择一个页面淘汰,并且根据其脏位判断是否应该写回外存;然后再将该页面放入被淘汰页面之前所占用的页框中(覆盖),并修改相应页表项(慢表和TLB)
(4)执行完调页后,将会重新执行引发缺页异常的指令(重新执行一遍访存过程):在408中,某一条指令引发缺页异常,操作系统处理完缺页异常(即完成调页),该指令重新执行时,TLB命中(缺页异常处理也会将TLB中的表项进行更新)
7.假设物理页框中可以存放数组A的1024个数组元素(即A[0] - A[1023]),TLB表初始为空,执行一下代码:
for (int i = 0; i < 1024; i++) a[i] = 0;
共需要访问1025次内存:
第1次访存,TLB未命中,根据内存中的慢表得到A[0]的逻辑地址得到A[0]的物理地址,并将该逻辑地址和物理地址的映射关系存入TLB中
第2次访存:根据A[0]的物理地址取出A[0]的数据
第3 - 1025次访存:TLB命中,分别根据表中的映射关系得到A[1] - A[1023]的物理地址,取出A[1] - A[1023]的数据(A[1] - A[1023]的物理地址到逻辑地址的转换无需访存,此时TLB中已经有存放A[0] - A[1023]的主存块的逻辑地址和物理地址的映射关系,而查询TLB不用访存;故仅需从内存中取出数据一次访存)
3.进程的存储空间
1.进程虽然拥有很大的一块逻辑地址空间,但是有很大一部分空间可能是空着的,只有需要使用的时候才进行相应的分配
2.通过将不同进程的某些页表项映射到同一内存空间(相同页框号)的方式实现页面共享(虚拟页号可以不同,两个进程的虚拟页号是相互独立的)
3.低地址部分进程独享;高地址部分(操作系统内核区)所有进程共享,即都是映射到相同的一片物理页框中(通过页表映射的方式实现)