内存管理习题解答
前言
本次将拿考研的经典题目作为解答的例子。一、第一小题如下:
某计算机主存按字节编址,逻辑地址和物理地址都是32位,页表项大小为4B,请回答下列问题
(1)若使用一级页表的分页存储管理方式,逻辑地址结构为
页号(20位) | 页内偏移量(12位) |
---|
问:页的大小是多少字节?页表最大占用多少字节?
-
首先我们拿到这个题不要慌张,先看规定好了的条件:
– 逻辑地址和物理地址都是32位
– 页表项大小为4B(这里要区分一下页的大小和页表项大小,这二者就好形容一个长方形,页的大小是长方形的长,页表项大小是长方形的宽)
-
之后看问题所问的是“页的大小?”
– 页的大小是由页内偏移量的位数来决定的
– 所以很容易得出:页的大小 = 212B(也就是4KB) -
再然后看第二个问题“页表最大占用多少字节”
– 在解决这个问题之前,我们要知道的是页表的表项数目是由页号的位数来决定的。
– 还有一个需要理解的点就是这个问题本身是要干什么,“页表最大占用多少字节”,这个问题中他问的是整个页表的最大占用字节,所以你要想题目中给出了一个表项的“宽度”(页表项的大小),我们现在就只剩下表项个数不知道,所以接下来的任务就是求表项个数(这就好比你在求一个由许许多多小长方形组成的长方形的边长,他给出了每个长方形的值,那么现在就只需要求出有多少个长方形就可以了)
– 表项的数目 = 220个,那么页表最大占用的字节数为 = 表项数目*页表项的大小 = 220 ×4B -
那么我们现在总结一下这一小题所考核的知识点:
-
页的大小和页表项的大小二者的概念
-
页的大小是由页内偏移量的位数决定
-
表项的数目使用页号的位数决定的
二、这一题的第二问如下:
采用(1)中的分页存储管理方式,一个代码段的起始逻辑地址为0000 8000H, 其长度为8KB被装载到从物理地址0090 0000H开始的连续主存空间中。页表从主存 0020 0000H 开始的物理地址处连续存放,如下图所示(地址大小自下向上递增)。请计算处该代码段对应的两个页表项的物理地址,这两个页表项中的页框号,以及代码页面2的起始物理地址
- 首先这个小题,我们先一点一点的看
– 第一句话就点明了,这一小问的所有逻辑地址和物理地址都是32位的
– 一段代码的初始逻辑地址已经给出了,不过是16进制的形式,这时我们先将16进制形式的逻辑地址转换为二进制形式
0000 8000H
0000 0000 0000 0000 1000 0000 0000 0000根据第1小问的逻辑地址格式可以推出,在改逻辑地址的低12位是页内偏移量(我标记为倾斜),剩下的20位全为页号,即为0000 0000 0000 1000
也就是十进制的8,所以该代码块的初始地址对应页表中的第8页号。
– 另外改代码块为8KB,一个页的大小为4KB,所以该程序代码应该占用两页,再看图中给的两个页表项是在一起的,那么该代码块所占用的是页表中的第8和第9页号
– 看后面这句话“装载到从物理地址0090 0000H开始的连续主存空间中”,所以代码初始的物理地址就是0090 0000H,将该16进制物理地址转换为二进制:
0090 0000H
0000 0000 1001 0000 0000 0000 0000物理地址的偏移量和逻辑地址中的页内偏移量是相同的,也就是物理地址的低12位是偏移量(清华大学陈瑜老师是这么说的页帧偏移量,我也不知道该叫啥),除了偏移量占的12位,剩下的20位就是内存块号(页帧号或者页框号),那么页框号1也就是00900H
– 题目中还给出了页表的起始地址0020 0000H - 到目前为止,我们已经一起把题目中的条件分析完毕,接下来我们该解决疑问了
– 首先要求两个页框号对应的物理地址:
有的同学可能已经开始疑惑了,这个题目中给的页表形式跟我们书本上的不一样啊,有的书本上的页表是页号和页框号一 一对应的,其实不然,页号是为了让我们人看着方便,其实要找到对应页框号还是需要将页表对应的物理地址求出来(这里的物理地址只是单纯的页表的地址)。
这个疑惑解决之后,我们正式来看怎么求物理地址:
在看题目分析时我们得出:代码块的起始页号是8,那么每个表项的大小为4B,所以页框号1对应的物理地址应该为:物理地址1 = 0020 0000H + 8×4B = 0020 0000H + 32(这里说明一下,要将十进制的32转换为16进制的0000 0020H)=0020 0020H,所以物理地址1是0020 00020H
物理地址2 = 0020 0000H + 9×4B(这里的9就是该段代码占的第二页的页号)= 0020 0000H+36 = 0020 0000H + 0000 0024H = 0020 0024H
– 之后问两个页框号是多少,我们首先要知道要根据什么来求页框号,页框号是在物理地址中的,我们需要将两个页框号对应的物理地址求出来,其中页框号1对应的物理地址已经求出来了,那我先拿这个地址做个示范:
代码页面1对应的物理地址:0090 0000H。在上面的分析时,我提到了物理地址的低12位是偏移量,除去这12位剩下就是页框号,所以页框号也就是00900H
而代码页面2的物理地址我们还不知道,所以暂时先把页框号2放下,先去求对应的物理地址
– 求代码页面2的物理地址:
我们现在知道了代码的起始地址为0090 0000H,而代码分为两个代码页面,每一个代码页面的大小为4KB,也就是一个代码页面的宽度大小是4KB,所以第二个代码页面的物理地址也就是:起始地址 + 第一个代码页面的宽度 = 0090 0000H + 4KB ,这时候重点来了,我们先将4KB转变为212,也就是4096,再将其转换为16进制1000H,所以物理地址 = 0090 0000H + 0000 1000H =0090 1000H
– 现在我们有了代码页面2的物理地址,再按照上面的算法,除去12位的偏移量,得到的页框号2为00901H - 至此,该问的所有问题已解答完毕
- 对应两个页表的物理地址为:0020 0020H 0020 0024H
- 两个表项的页框号:00900H 00901H
- 代码页面2的物理地址为: 0090 1000H