模板建站和仿站,wordpress回复下载插件,做ppt的软件模板下载网站,金华市有网站建设最低价前面我们分析了虚拟地址和物理地址
我们这里进行一个简单的分析
这个是程序运行时的地址映射 那么这些碎片#xff0c;我们现在的操作系统究竟如何处理呢#xff1f;
我们再引入一个实际问题
我们如何把右边的进程p塞入左边的内存空间里面 有一种方法将p5kill掉#xff…前面我们分析了虚拟地址和物理地址
我们这里进行一个简单的分析
这个是程序运行时的地址映射 那么这些碎片我们现在的操作系统究竟如何处理呢
我们再引入一个实际问题
我们如何把右边的进程p塞入左边的内存空间里面 有一种方法将p5kill掉那么p就可以插入但这种方法绝对不是首选。
我们可以将p进程分为几块塞入内存空间里面
但是如果我们需要运行这个进程需要有一个记录记录p进程的各个碎片是怎样分布在内存里面的。 这样就引出了我们的分页和分段机制了
1.解决内存碎片将进程分片存放 因为我们写程序的时候是分段函数、变量、数组等写的
我们可以将这些东西分段存放 我们对于分段的寻址是需要段id段内位移地址 那么我们怎么将逻辑地址转化为物理地址
我们分段表内存储段id段内偏移段内最大长度
先拿出段内位移然后根据所在的段号进行判断判断失败报错成功用基址加上短萼你位移取出物理内存地址。 我们看例题
第一题解题方法
main那条语句为pc寄存器存储的地址我们可以看到0x240为此地址的虚地址
那么我们可以画出
0x0240填入逻辑地址二进制为
0000 0010 0100 0000
又物理地址等于基址逻辑地址
最前面的2bits 00 代表段号那么我们可以得到段号为code0基址为0x4000
根据等式可以得到0x40000x02400x4240 第二题第一步我们可以大致判断是将一个地址存入一个变量或一个寄存器里面目前来看没啥用。我们根据pc4,且前面2bits的段号并没有变基址还为0x4000可以得到0x40000x02400x00040x4244
第三题第一步也是存储了一个地址但他这里注释了是返回地址对这题来说也没啥用
move 0x0360转换
0000 0000 0011 0110 0000
这里可以得到段号还是0也就是说基址还是0x4000
那根据前面的算是可以得到0x40000x03600x4360
第四题大家可以自行判断
答案为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*4323 因为是从0开始的所以这里要减1
第二个|2|3|我们可以得到2*4311-110
第三个|1|3|我们可以得到0*433-12 这里可以看出这个帧页的大小和磁盘的block块有异曲同工之妙 这里地址
页数2^(m-n)页尺寸为2^n整个地址长度为m 页和段分区的特点对比大家自信分析一下