Linux kernel 分析之二十:内存管理-内核中的页表映射总结

本文探讨Linux内核如何进行内存管理,尤其是页表映射。内核将3~4G线性地址的896M映射到0~896M物理地址,128M用于非线性映射和高端物理地址映射。即使物理内存小于896M,内核和用户空间仍能通过映射共享内存。内核通过临时和永久映射访问高端内存,所有进程共享内核页表,页错误处理程序确保页目录同步。
摘要由CSDN通过智能技术生成

从线性地址到物理地址的转换,实际上是一种映射。所有进程的3~4G的线性地址实际上是映射到相同的物理地址的。这一点不多说了。为了方便起见,3~4G的线性地址与对应的物理地址基本上是呈线性关系的。即线性地址=物理地址+3G。但是如果把这1G的线性地址都简单地处理为对应物理地址+3G,就会有新的问题产生。例如,如果物理地址大于4G,那么内核就没法访问这些地址了。所以,内核必须要从这1G的线
性空间中预留一部分,作其它用途,(例如,映射高端物理地址)。经过实践,发现128M线性地址够用了。所以,3~4G的线性地址中896M映射到物理地址中的0~896M,剩下的128M挪作它用,例如,内核空间的非线性映射(在vmalloc中使用)以及高于4G的物理地址的映射。
    我曾经产生过的疑问:
    1.如果物理内存小于896M,那不是所有的物理地址都被内核用完,没有内存留给用户空间了么?
    事实上,小于896M时,同一块物理内存可能同时被映射到用户空间和内核空间,从数学的角度来讲,也就是所谓的“双箭一雕”。我们相信内核是没有bug的,所以不用担心因此产生的内核对用户空间数据破坏的可能性。
    2.如果物理内存小于896M,所有物理内存地址都与内核线性地址相差3G,那vmalloc不是没有内存使用了么?
    不使用vmalloc当然是不可能的,因为模块装载时就会用到vmalloc。原理与问题1一样,即使在内核空间,也可能多个线性地址映射到同一个物理地址,也就是“双箭一雕”。所以vmalloc仍然能获得相应的物理内存。
    对以上两个问题的小结。系统在启动时会把前896M物理地址映射

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值