从线性地址到物理地址的转换,实际上是一种映射。所有进程的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物理地址映射到3G以上的线性空间。但是映射不等于使用。事实上内核只使用了很小一部分(一般才几M)。只要有足够的未使用的物理内存,用户进程和vmalloc都不会有问题。
3.如果物理内存大于896M。那对内核而言不是无法在同一时刻访问所有的物理内
Linux kernel 分析之二十:内存管理-内核中的页表映射总结
最新推荐文章于 2025-05-28 13:00:31 发布