第二题第一步我们可以大致判断是将一个地址存入一个变量或一个寄存器里面(目前来看没啥用)。我们根据pc+4,且前面2bits的段号并没有变(基址还为0x4000)可以得到0x4000+0x0240+0x0004=0x4244
第三题第一步也是存储了一个地址,但他这里注释了是返回地址(对这题来说也没啥用)
,move 0x0360转换
0000 0000 0011 0110 0000
这里可以得到段号还是0,也就是说基址还是0x4000
那根据前面的算是可以得到0x4000+0x0360=0x4360
第四题大家可以自行判断
答案为:0x4364
最后一题,我们发现这个是将a0的地址读一个byte并写入t0,第一题我们知道了a0里的内容为 0x4050
0x4050转化为二进制
0100 0000 0101 0000
这是一个虚拟地址,这个区间是属于段号1的(也可以根据段号判断这里是01)
我们得到段号
01(舍掉)00 0000 0101 0000 舍掉的补0(因为前两个bits代表段号)
偏移量等式逻辑地址减去前面两位bits补0
0000 0000 0101 0000 得到偏移地址0x050
那么我们要得到真实地址需要0x4800 + 0x0050 = 0x4850
其实我们可以分析这段代码是读取一个字符串,当然后面还有很多大家可以自己看下这个代码
分页机制
因为段的大小是不等的,只不过是分的更小一些,那么产生的碎片肯定是会更小的
所以分段对于外部碎片问题并没有完全解决
这里有个基本单元叫做帧也有叫页框的,内存划分的固定大小的区块(注意这里是固定大小不是大小不等),但里面可以离散存放。将进程分成一条一条的整个叫做页面
我们将页面内的每条存入内存中任意空闲的页框(帧)当中
再将他们记录下来
存这个记录的叫做page table 页表
原理和分段是差不多的
那么我们如何得到物理地址呢?
根据下面图我们算下要找page号为0的进程条的物理地址
查页表发现page号为0的这条数据存入了帧号为5的区域
我们根据frame no——5来从内存中查找定位到一块区域(这里可以看到每个页大小为4bytes),注:帧大小和页大小一样
我们再根据页内位移定位物理位置
这里我们可以得到实际的参与运算的参数为 frame no. * page size + 页内位移 = 物理地址
第一个|0|3|我们可以得到5*4+3=23 因为是从0开始的所以这里要减1
第二个|2|3|我们可以得到2*4+3=11-1=10
第三个|1|3|我们可以得到0*4+3=3-1=2
这里可以看出这个帧(页)的大小和磁盘的block块有异曲同工之妙
这里地址
页数2^(m-n),页尺寸为2^n,整个地址长度为m
页和段分区的特点对比,大家自信分析一下