3.20分段与分页结合的实际内存管理

datecommentscategoriestagspermalinktitle
2020/3/4
true
操作系统
内存
分区
3.20
分段与分页结合的实际内存管理

逻辑地址

指的是程序产生的和段地址相关的偏移地址。例如在C语言中,

int a = 9;
int *p = &a;

这里取到的地址p其实就是逻辑地址,是相对于你当前进程数据段的地址,不和绝对物理地址相干。 编程人员只跟逻辑地址打交道就好了。而分段和分页,就交给操作系统来完成,这对开发人员来说是透明的。所以应用程序员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。

线性地址

是逻辑地址到物理地址变换之间的中间层。程式代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G,2的32次方.

物理地址

就是我们电脑上的内存条中的实际地址,通常情况下,线性地址经过页目录和页表进行地址变换,成为最终的物理地址。

虚拟内存

内存是有限的,但是有时候我们又需要运行较大的程序,通过虚拟内存机制可以让计算机表现出比实际大得多的内存空间。
一个恰当的比喻就是,程序就是一辆未启动的火车,启动后跑起来的火车就是进程,而火车要在铁轨上跑,铁轨就相当于内存。内存有限就是铁轨的长度有限,但是又会出现火车要从北京开到上海这种长途的旅行。铁轨不够长怎么办呢?——就把火车跑过的铁轨搬到火车前面,铺成“新的铁轨”,只要我拆铁轨,铺铁轨的速度足够快,火车就追不上我。这就是虚拟内存管理需要完成的任务。实际就是拆东墙,补西墙,在Linux0.11内核中,给每个进程都划分了总容量为64MB的虚拟内存空间。因此程式的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为 虚拟地址。因为和虚拟内存空间的概念类似,逻辑地址也是和实际物理内存容量无关的。

继续前面的比喻,火车上的人通常都想要知道自己走到什么地方了。那怎么表示旅客的位置呢?可以记住乘客上车的车站(内存分段,段基址),上车后走过了多少节铁轨(字节,即偏移地址)。段基址加上偏移地址就是线性地址,再结合火车的出发站进行运算,我们就可以在地图(引入地图)上精确的得出乘客的位置(物理地址).地图为了显示方便,都会标明比例尺(内存分页),电子地图的比例尺是可以变化的,比如要在中国地图上找到北京市公主坟车站,我们往往先定位到河北省(一级分页),在定位的北京市(二级分页)···,这个过程中比例尺在不断缩小,直到最后找到目的地。又由于一个乘客往往在指定站点(经常访问的地址)上车,所以计算机硬件引入了CR3寄存器专门用来保存这个地址(页目录位置),从而加快寻址速度。

代码实现

如上图所示,当系统fork出一个子进程的时候会分配虚拟内存,即逻辑空间64M*nr,p指针就是(task_struct)新进程的指针,构建进程对应的ldt。

之后建立页表。

多级分页中的目录编号,每页4k

找到空闲的空间分配页表

初始化页表

新的进程创建完毕.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值