前面我们分析了虚拟地址和物理地址
我们这里进行一个简单的分析
这个是程序运行时的地址映射
那么这些碎片,我们现在的操作系统究竟如何处理呢?
我们再引入一个实际问题
我们如何把右边的进程p塞入左边的内存空间里面
有一种方法将p5kill掉,那么p就可以插入,但这种方法绝对不是首选。
我们可以将p进程分为几块塞入内存空间里面
但是如果我们需要运行这个进程需要有一个记录,记录p进程的各个碎片是怎样分布在内存里面的。
这样就引出了我们的分页和分段机制了
1.解决内存碎片,将进程分片存放
因为我们写程序的时候是分段(函数、变量、数组等)写的
我们可以将这些东西分段存放
我们对于分段的寻址是需要段id+段内位移地址
那么我们怎么将逻辑地址转化为物理地址
我们分段表内存储段id+段内偏移+段内最大长度
先拿出段内位移然后根据所在的段号进行判断,判断失败报错;成功,用基址加上短萼你位移取出物理内存地址。
我们看例题
第一题解题方法:
main那条语句为pc寄存器存储的地址,我们可以看到0x240为此地址的虚地址
那么我们可以画出
0x0240填入逻辑地址二进制为
0000 0010 0100 0000
又物理地址等于基址+逻辑地址
最前面的2bits 00 代表段号,那么我们可以得到段号为code(0)基址为0x4000
根据等式可以得到0x4000+0x0240=0x4240