内核杂谈——学内存管理

把下述的源码追几遍就ok了,基础算是扎实了。写的内容有限,但代码无限。

 

页表建立

页表建立存在于用户空间的地址和内核空间的地址。二者有着微妙的差别。

内核空间页表建立

内核空间的页全局目录表为swapper_pg_dir,只要是内核地址(如何区分?pgd_offset使用参数init_mm 和 mm来区别建立映射)就使用这个pgd,而且内核空间地址都统一使用这个pgd。一开始建立的时候肯定是空空的啥都没有,尤其在建立设备树的映射中连物理内存都摸不到。但办法总是有的,使用内核映像里的bm_pXd/bm_pte来建立页表,最终填入设备树地址。有了设备树地址那么就可以知道物理地址了,memblock就诞生了。在建立线性映射的时候就使用memblock获取4K对其的物理地址来建立页表,最终填入内存地址。
每级建立的方式是通过一个个物理地址来进行的

用户空间的页表建立

用户空间有许许多多的进程,每个进程的空间由mm来管理,当然有一套属于自己的pgd。神奇的是用户空间的页表建立是通过缺页异常的方式,每级页表的建立通过向伙伴系统申请page的方式来填充,最终的pte页表会根据不同的缺页方式来实现填充。
每级建立的方式是通过一个个page来进行的,范围为4K,会通过mk_pte方式转为一个物理地址。


页表建立的作用就是在有MMU的机器中能够让CPU已访问虚拟地址的方式访问物理地址。

 

伙伴系统

伙伴系统的存在就是为了更好的管理内存。当内核空间建立完线性映射后,内核空间就可以访问所有的内存了,然后根据地址范围建立一个个zone,每个zone管理一部分的内存,内存以page大小存放在free_area中。一开始建立的时候free_area是空的,需要从memblock过渡到伙伴系统首要做的就是要有货真价实的page,在zone的初始化时,会在内核空间申请出一块空间用于存放page,page的数目和内存一致,然后建立两者联系,就有了pfn_to_page等这些转换,这些转换会涉及到一些内存模型,不同的内存模型转换方式也不一样。
当zone就绪后,memblock就退休了,将可用的内存全部存放到free_area中,其余不可用的就不给free_area了。那这个伙伴到底体现在哪里?答案在free_page中。


内存分配

内存分配也分用户空间和内核空间

内核空间的内存分配

1 alloc_page

这个函数是所有页的总分配方式,不管何种方式获取内存都会调用到。分配方式是从目标zone的free_area中或取page。这里有很多学问,比如zone的选取,内核偏爱高端的zone,但是事实受限于分配掩码来限制zone的选择;还一个学问,有了zone也不一定可以分配出page,分配方式受到水位的限制,水位低就无法以正常方式获取page,继而可能转向慢速分配的过程,慢速分配更是一个大学问。

2 slab

slab是内存里的小内存的称呼,通常以byte为单位,存放一些常用的数据结构task、vma、mm等。但核心还是从alloc_page中获取page,这里获取到的page就不是普通page了,会把page按照某个对象的大小割成一个个小块然后使用里面的空闲小块。

3 kmalloc

在slab的初始化过程中会特意初始一些特定大小的内存小块,本质和slab一致。

3 vmalloc

vmalloc存在内核空间,区分于内核线性空间,但比较类似于用户空间。vmalloc的空间使用过会加入到红黑树中管理,本质上是以一个个长度(vmalloc的参数)区间添加到红黑树中,使用时候无需考虑地址,地址由系统指定。由于vmallc区间并非线性空间,没有物理地址关联,所以使用还需要和物理地址建立关系。这里物理地址的获取根据申请的长度来确定需要的页数,然后一页一页的去申请,所以物理地址是不连续的。

用户空间的内存分配

malloc和mmap

malloc和mmap是用户空间申请内存的主要方式,最终还会用到内核空间的page。用户空间申请的地址存放在vma中,这部分空间有可能是一个原始的未建立物理地址映射的空间,通常会发生缺页异常。异常发生后会建立页表参考上面讲的用户空间的页表建立。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 内核内存管理优化是一个持续不断的过程,需要不断地改进和优化。这个过程中涉及到很多的内核开发者和贡献者,下面简单介绍一些内存管理优化的进程: 1. Linux 内核社区:Linux 内核社区是 Linux 内核开发的主要场所,它包括了很多的内核开发者和贡献者。在 Linux 内核社区中,内存管理优化是一个重要的议题,社区中的开发者和贡献者会就内存管理的问题进行讨论和交流,并提出改进和优化的建议。 2. 内存管理子系统维护者:在 Linux 内核中,内存管理是一个独立的子系统。这个子系统有专门的维护者,他们负责内存管理的开发、维护和优化工作。内存管理子系统维护者会根据社区的反馈和需求,不断地改进和优化内存管理的代码,提高内核的性能和稳定性。 3. Linux 内核开发者:除了内存管理子系统维护者之外,Linux 内核开发者也会参与到内存管理优化的工作中来。他们会在内核的不同模块中,对内存管理进行改进和优化,例如在文件系统中对内存进行缓存、在网络协议栈中对内存进行管理等。 4. 厂商和社区用户:Linux 内核不仅是开源软件,也是很多商业厂商采用的操作系统内核。因此,厂商和社区用户也会参与到内存管理优化的工作中来。他们会根据自己的需求和场景,提出内存管理的改进方案并提交到社区中,从而促进内存管理的优化。 总之,Linux 内核内存管理优化是一个社区化的进程,需要内核开发者、维护者、厂商和社区用户共同参与和推动。只有这样,才能不断地提高 Linux 内核内存管理性能和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值