linux内存段页,Linux内存管理之分段机制

前面一篇文章讲到逻辑地址到线性地址的转换,也就是分段机制的实现.分段机制虽然能够让程序员方便地管理程序的各个段,并且可以动态调整段的大小,而且对内存的碎片率也大大减小.但是还是没有解决程序大小比物理内存还大的问题,这时候就出现了分页机制,分页机制的出现最大的体现就是虚拟内存,虚拟内存的实现可以让大的程序装入内存.分页机制的实现还导致了部分程序装入,按需分配内存,代码共享等.

5c97e93cfd4223940870a294d1ecbb11.png

根据上图,逻辑地址通过分段机制变成线性地址,线性地址通过分页机制变成物理地址。那么怎么奖线性地址转换成物理地址呢?首先,对于没有启用分页机制的系统(通过一个寄存器的某一个比特判断)。则直接把线性地址映射到物理地址,物理地址传入到地址总线上。若是启用了分页机制,CPU会把线性地址进行拆分。

这里引入先页的概念,OS把虚拟内存切割,每部分的大小都是一样的(一般可以根据硬件指定),每部分就叫做页(Page),每张页都对应物理内存中的页框(Page Frame,其实就是依次个对应的关系)。

但是线性地址中某个标号为N的页,在物理内存中标号可以是M(N!=M)。也就说可以每个线性地址页都在物理内存中有相对应的页框。而页和页框的对应关系是存在页表里面的,这里可以这样理解,页是一个函系统的输入,页框是一个系统的输出,而页表就是这个系统.但是一张页表要处理整整4G(32位)的大小,光光这张页表就需要很大了.所以就引入二级页表的概念,也可以说成是页目录,页目录的原理和前面页表的作用一样,只不过页目录这个系统的输入是页号,而输出是页表的地址.

好了,理解了上面的基本概念之后,我们就开始线性地址到物理地址的转换.对于一个线性地址,前面的10bits当作页目录项,找到页目录项后就找到对应的页表起始地址,根据线性地址的中间后面10bits(页表的偏移)+页表起始地址,找到物理内存中的页框地址,内存中的页框地址+线性地址低12位就是实际的物理地址.

同样的,上述过程在访问最终的物理内存之前,要进行两次内存访问,两次查表,效率肯定就低了.现代计算机会把页表和页目录也用硬件进行缓存,当然是一部分常用的项.0b1331709591d260c1c78e86d0c51c18.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值