1.Linux内核映射
从上面的页表设置可以看出:
- 内核对内核虚拟地址和物理地址之间的转换,是会有需求的。
很容易可以想到最简单的解决方法:
- 将内核虚拟空间地址,和实际物理空间逐一对应进行线性映射。
在很早期的时候,确实就是这样做的。
但是在32位时代,内核的虚拟空间只有1G,也就是说全部都进行线性映射的话,
内核只能使用1G物理内存,但是我们也知道就是32位时代,其实物理内存很多也不止4G了,
而且CPU后面也相应支持。
但是,虚拟地址空间还是只有4G,内核还是只有1G,如果还是进行直接线性映射的话,
内核根本没办法享受这个福利,原因很简单:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTHtDY04-1594714031611)(C:\Users\RayInt\Desktop\workplace\RayBlog\Linux学习\页表研究\pic1.png)]
那该怎么办呢?也很简单,抽出一个部分内核虚拟空间,像用户虚拟空间那样进行非线性映射就行了:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbwFYFE1-1594714031614)(C:\Users\RayInt\Desktop\workplace\RayBlog\Linux学习\页表研究\pic2.png)]
可以设想那样的操作:
- 数组p放在了物理空间[paddr1, paddr8],内核虚拟空间为[kvaddr1, kvaddr4];
- 首先讲 [kvadd1, kvaddr4] 映射到 [paddr1, paddr4],进行操作;
- 操作完毕,解除映射;
- 然后将 [kvaddr1, kvaddr4] 映射到 [paddr5, paddr8],进行操作;
- 操作完毕,解除映射;
这样就可以用很小的内核虚拟空间,操作大很多的物理空间;
2. 什么是低端内存和高端内存
有了上面的铺垫,高低端内存是什么就很容易说明了。
没错,高低端内存是内核虚拟空间中的划分:
-
低端内存就是内核虚拟空间中,直接和物理空间进行线性映射的那一部分,
类似上图中的内核虚拟地址1~2;
-
高端内存就是内核虚拟空间中,和用户空间一样进行动态映射的一部分,
类似上图中的内核虚拟地址3;
但请注意,
就如上一节所说那样,这是因为在32位架构下,内核虚拟空间实在太小了,
所以抽出了一部分作为高端内存,以达到操作大于1G物理内存的效果。
在64位内核虚拟空间足足有512G,
高端内存这个概念,一般来说在64位内核中应该不存在。
但64