317_基本地址变换机构
# 3.1_7_基本地址变换机构
各位同学大家好,在小节中我们会学习基本地址变换机构相关的内容,这个小节的内容也属于基本分页存储管理。 其实所谓的基本地址变换机构,就是在基本分页存储管理当中,用于实现逻辑地址到物理地址转换的一组硬件机构,我们在学习小节的过程当中需要重点掌握这些变换机构的工作原理,还有流程小节的内容十分重要,既有可能作为选择题,有可能结合大题进行考察。
# 基本地址变换机构
通过上个小节的讲解,我们知道在分页存储管理当中,如果要把逻辑地址转换成物理地址的话,总共需要做4件事。
- 第一要知道逻辑地址对应的页号,
- 第二还需要知道逻辑地址对应的页内偏移量。
- 第三,我们需要知道逻辑地址对应的页面在内存当中存放的位置到底是多少。
- 第四,我们再根据这个页面在内存当中的起始位置和页内偏移量,就可以得到最终的物理地址了。
为了实现这个地址转换的功能,系统当中会设置一个页表寄存器,用来存放页表在内存当中的起始地址,还有页表的长度这两个信息。在进程没有上处理器运行的时候,页表的起始地址,还有列表长度,这两个信息是放在进程控制块里的。只有当进程被调度需要上处理机的时候,操作系统内核才会把这两个数据放到页表寄存器当中
我们接下来用一个动画的形式看一下,从逻辑地址到物理地址的转换应该是什么样一个过程。
我们知道操作系统会把内存分为系统区和用户区,在系统区当中会存放着一些操作系统,对整个计算机软硬件进行管理的一些相关的数据结构,包括进程控制块PCB也是存放在系统区当中的
如果说一个进程被调度,它需要上处理机运行的话,进程切换相关的那些内核程序,就会把进程的运行环境给恢复,这些进程运行环境相关的信息本来是保存在PCB当中的,之后内核程序会把这些信息把它放到相应的一系列寄存器当中,包括页表寄存器,页表寄存器当中存放着进程的页表的起始地址,还有页表的长度。另外像程序计数器PC也是需要恢复的,程序计数器是指向进程下一条需要执行的指令的逻辑地址a。那么接下来我们来看一下怎么把这个逻辑地址转换成实际的物理地址,也就是说CPU怎么在内存当中找到接下来要执行的这一条指令。
从上个小节的讲解中,我们知道采用分页存储管理方式的这种系统当中,逻辑地址结构肯定是固定不变的,在一个逻辑地址当中,页号有多少位,页内偏移量有多少位,这些操作系统都是知道的。所以只要知道了逻辑地址a那么就可以很快的切分出页号和页内偏移量这样的两个部分。
接下来会对页号的合法性进行一个检查,一个进程的页表长度m,指的是进程的页表当中有m个页表项,也就意味着进程的页面总共有m页。所以如果此时想要访问的页号已经超出了进程的页面数量的话,那么就会认为此时想要访问的逻辑地址是非法的,这样就需要抛出一个越界中断
如果说页号是合法的,那么接下来会用页号和页表始址来进行计算,找到这个页号对应的页表项到底是多少。通过上个小节的讲解,我们知道页表当中的每一个页表项的长度其实是相同的,所以其实只要我们知道了页号,还有页表起始地址,在知道我们每一个页表项的长度,我们就可以算出我们想要访问的页号对应的页表项所存放的位置。
既然知道了它存放的内存块号,我们就可以在用内存快号结合页内偏移量得到最终的物理地址,然后就可以顺利的访问逻辑地址a所对应的内存单元了,所以整个过程做了这样几件事。
- 第一是根据逻辑地址算出了页号和页内偏移量。
- 第二需要检查这个页号是否越界,是否合法。
- 第三,如果这个页号是合法的,那么我们会根据页号还有页表始址,来计算出页号对应的列表项应该是在什么地方,然后找到相应的页表项。
- 第四,在我们得知了这个页面存放的内存块号之后,我们就可以用内存块号,还有页内偏移量来计算出最终的物理地址,然后最后在对物理地址进行访问。
在考试当中经常会给出一个逻辑地址,还有页表,然后让我们计算对应的物理地址,所以大家需要对上面所说的这些过程都非常的熟悉,
接下来我们再用文字的方式再给出一个描述。虽然说内容比较重复,但是也是因为这个部分内容极其重要,所以想多让大家过几遍。
如果说一个系统当中页面大小是L,我们要实现逻辑地址a到物理地址e的变化,需要经过这样几个步骤,
- 第一,我们需要用逻辑地址a,计算页号p还有页内偏移量w。如果说题目当中是用10进制给出的话,那么我们对页号和页内偏移量的计算分别是这个样子,在上个小节当中也介绍过,但是对于计算机来说,实际运行的时候,逻辑地址结构是固定不变的,因此计算机硬件就可以根据这个逻辑地址结构,很快速的得到二进制表示的页号和页内偏移量了。
- 在得到了页号和页内偏移量之后,我们需要对页号进行一个合法性的检查,用页号和页表长度m进行一个对比,如果页号大于等于m的话,那就会发生一个越界中断,否则就会继续执行。这个地方需要注意的是当页号p等于页表长度m的时候也会发生越界中段,因为页号是从0开始的,而页表长度至少是一,所以假如一个进程的页表长度是1,那么它的页号最大只应该是0,如果想要访问页号为一的页面,其实就应该已经发生越界了,所以这个地方取等号的时候也是会产生越界中断的,小细节一定需要注意
- 在确认页号合法之后,我们就需要在页表当中找出这个页号对应的页表项地址,页表项地址就等于页表的起始地址F 再加上页号p乘以页表项的长度,这个式子的有来咱们在上个小节当中也介绍过,在找到了页号对应的页表项之后,就可以取出页表项里的内容b也就是这个页面存放的内存块号。对于初学者来说,这儿有几个很容易混淆的概念,页表项长度,页表长度,还有页面大小这三个概念。所谓的页表长度指的是页表当中能够有几个页表项,一个进程的页表当中有几个页表项,就意味着进程总共有几个页面,而页表项长度指的是每个页表项应该占多大的存储空间,页面大小指的是每一个页面应该占多大的存储空间,这几个概念确实是比较容易混淆的,特别是页表长度,还有页表项长度这两个概念一定要着重注意一下。
- 在我们知道了页面存放的物理块号之后,我们就可以用物理块号乘以页面的长度l再加上页内偏移量w就可以得到最终的物理地址了。
不过这种计算方式一般是我们手动做题的时候使用的一种方式,对于计算机来说其实想要得到物理地址有一种更简单的方法,其实计算机只需要把内存块号b还有页面偏移量w用二进制表示,再把这两个二进制数拼接起来,其实就是最终的物理地址了。
这个地方大家可以自己动手验证一下,假设一个系统当中页面大小l是一k比,也就是2的10次方个字节,最终要访问的内存括号是b=2,页内偏移量w等于1023,那么大家可以分别尝试用这种方式,还有刚才提到的内存块号和页内偏移量,用二进制表示,并且把它们拼接起来,得到物理地址的这种方式。来看一下这两种结果是否一致。这个地方验证这儿就暂时不展开,大家下去动手尝试一下
我们用一个具体的题目来练练手。假设一个系统当中页面大小l为1k字节,也就是2的10次方字节,页号二对应的内存块号b=8,也就是2号页面应该存在内存块号为8的地方,将逻辑地址a等于2500转换成物理地址e
这个题目其实还有一些等价的问法,比如说某系统按字节寻址,按字节选址就意味着这个系统当中每个地址对应的是一个字节,逻辑,地址结构中页内偏移量占10位,这个信息很重要,页内偏移量的位数其实直接就决定了一个页面的大小是多少,那么偏移量占10位的话,就说明一个页面的大小应该是2的10次方的字节,也就是1KB,所以这种说法和上面这种说法其实等价的。在做题的时候一定要注意页内偏移量,还有页面大小之间的这种对应关系
进行地址的转换,第一步我们应该根据这个条件算出页号和页面的偏移量,由于题目当中给出的是这种10进制表示的逻辑地址,所以我们用除法还有取余操作这样的方式来计算会更方便一些。所以经过计算发现页号是二,页内偏移量是452,而根据题目当中给出的条件,页号二对应的内存块号等于8,也就是说明页号为二的页表项是存在的,因此页号2肯定没有越界,并且查询页表之后已经知道这个页面应该是存放在内存括号为8的地方。
第三步我们知道了内存快号,知道了页号页内偏移量,我们就可以计算物理地址,物理地址等于内存块号乘以每一个页面的大小,或者说每一个内存块的大小,再加上页内偏移量,最终就可以得到8644这样一个结果。
大家有没有发现,其实在分页存储管理或者说页式管理的系统当中,只要我们确定了每个页面的大小是多少,那么逻辑地址的结构肯定就已经确定了,所以页式管理当中的地址是一维的,我们并不需要告诉系统除了逻辑地址以外的别的信息,不需要显示的告诉他页内偏移量要占多少,页号占多少,因为这些信息都是确定的,所以在页式管理当中,我们想要让系统把逻辑地址转换成物理地址,只需要告诉系统一个信息,也就是逻辑地址的值,不需要在告诉系统别的任何信息,因为只需要告诉他一个信息,因此这个地址是一维的,这就是我们手动的模拟基本地址,变换机构转换地址的一个过程。
很多初学者会忽略的是对页号进行越界检查的这一步操作,所以这个地方需要留个经验。
# 页表项大小
接下来我们再对上一节提到过的页表项大小这个问题进行进一步的探讨。在上个小节中我们已经知道每个页表项的长度是相同的,页号是隐含的,如果一个系统当中内存大小4GB,页面大小4KB,这些内存总共会被分为2的20次方个内存块,所以我们至少需要用20个二进制为才能表,表示这么多的内存块号,所以页表项的长度至少要三个字节才够,这些页表项会被连续的存放在内存当中,并且每个页表项的长度都是占三个字节,
所以只要我们知道了页表在内存当中存放的起始地址x,就可以用x加上3乘以m,得到m号页面对应的页表项存放的位置,但是我们再把这个问题深入的分析一下,
这个系统当中一个页面大小是4KB,所以每个页面可以存放4096÷3,也就是1365个页表项,但是1365个页表项并不能占满整个页框,这个页框 还会剩于一个字节的页内碎片,由于这个地方只剩一个字节的空闲区域了,所以下一个页表项只能存放在下一个页框当中,它不能跨页框的存储,所以1365号页表项存放的地址应该是x加上3×13651,+1就是为了消除剩余的一字节造成的误差。所以可以发现如果说我们的这些页表项并不能装满整个页框的话,在查找页表项的时候,其实是会造成一些麻烦的。
所以为了解决这个问题,我们可以把每个页表项的长度再拓展一下,把它拓展到4个字节,这样的话我们就可以保证每个页框刚好可以存放整数个1024个页表项,并且不会有任何的这种页面碎片,就像这个样子。这样的话我们要查询1024号的页表项,我们就不需要像上面这么麻烦了,因为这个页框当中不会有任何的页内碎片,
所以在理论上来说页表项的长度最短三个字节就可以表示所有的这些内存块号的范围,但实际应用当中为了方便页表的查询,经常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项。
不过即使这个页表项长度是三个字节,其实也没问题,只不过在查询页表的时候可能会需要做一些更麻烦的处理。如果在题目当中要我们算页表项的长度最小应该是多少,我们按照三字节这样的思路来处理就可以了。4个字节这样的处理只是实际应用当中为了方便而采用的一种策略。
经过刚才的这个例子,大家有没有发现一个进程,如果它的页表太大,也就是页表项太多的话,那么进程的页表一般来说装到内存里也是会尽可能的让它装在连续的一些内存块当中,因为这样的话,我们都可以用统一的一个计算方式,就可以得到我们想要得到的页表项所存储的位置。
# 小结
在这个小节当中,我们学习了如何使用基本地址变换机构这一系列的硬件来实现地址转换的一个过程,基本地址变换机构当中最重要的硬件就是页表寄存器,大家需要知道页表寄存器有什么作用,这个小节中最重要的是要掌握地址变换的整个过程,我们要知道计算机是怎么是一步一步实现这些地址变换的,并且还要能用手动的手算的方式来模拟出整个地址变换的过程。这部分是大题和小题的极高频的出题点。
除了地址变换过程之外,我们在讲解的过程中也补充了一些小的细节,比如说页内偏移量的位数和页面大小之间是有一个对应关系的,如果说题目当中给出了页内偏移量的位数,大家需要能够推出页面的大小。同样的如果告知我们页面大小,也能要能够推出页内偏移量的位数,如果知道地址逻辑地址的总位数的话,那么我们还要能够写出整个逻辑地址指的地址结构,小知识点在计算题当中是很容易用到的,
除了这个之外,页式管理的地址是一维的,这一点也经常在选择题当中进行考察。那大家要理解什么叫一维,所谓的一维就是说我们要让 CPU帮我们找到某一个逻辑地址对应的物理地址的话,我们只需要告诉CPU一个信息,也就是逻辑地址的值,并不需要再告诉他其他的任何信息,所以这是一维的含义。而另外的这两个小细节只是为了能够让大家更充分的了解这种页式管理的机制才补充的,但考试当中一般来说不会考察,
除了这些内容之外,我们还需要注意一个很重要的知识点,在CPU得到一个想要访问的逻辑地址之后,一直到实际访问了逻辑地址对应的内存单元的整个过程当中,总共需要进行两次访问内存的操作。第一次访问内存是在查询页表的时候进行的,第二次访问内存是在实际访问目标内存单元的时候进行的,在下个小节当中,我们会探讨一种新的地址变换机构,是否能用一种别的地址变换机构来减少访问内存的次数,从而加快整个地址变化还要访问的过程,这是下个小节想要探讨的问题。