【INT的内核笔记】Linux内核内存空间布局研究

本文详细探讨了Linux内核在32位和64位架构下的内存空间布局,包括低端内存和高端内存的概念。在32位系统中,内核采用线性和非线性映射结合的方式来利用物理内存;而在64位系统中,内核虚拟空间可达512GB,可以直接映射全部物理空间。内核偏爱连续物理内存主要是出于性能考虑,如DMA和缓存效率。文章还介绍了kmalloc和vmalloc的区别。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值