linux内核的内存管理

前言

学习自用总结,有错麻烦提一下

内核内存管理总结

内核空间总是驻留在内存中,它是为操作系统的内核保留的

内核的内存分配不同于用户空间的内存分配,,内核态的内核分配会即时满足,而用户态的分配会延迟分配,即只分配虚页(可以看下用户空间分配的写时复制机制),等访问到那个页面再引发缺页中断从而进行物理分配,所以可以说,内核的内存分配是物理页的分配,而用户空间内存的分配是虚拟页的分配

而内核里内存的分配,也就是物理内存的分配主要有这么几种

参考资料9说内存管理分为两个层级,一个是伙伴系统来管理物理页,第二层级是在伙伴系统之上的slab layer和其他

物理页在系统中由页结构struct page描述,系统中所有的页面都存储在数组mem_map[]中,可以通过该数组找到系统中的每一页(空闲或非空闲)。而其中的空闲页面则可由上述提到的以伙伴关系组织的空闲页链表(free_area[MAX_ORDER])来索引

第一种分配方式,首先是按页来请求内存,用alloc_pages()和它的几个兄弟函数可以实现按页分配,即直接请求返回的是一个或者多个页框;而对于页框的管理,内存中不同页会被分为不同zones,区分标准有这么几种:

  • DMA是否能直接操作, (会优先保留以防需要用到DMA的调用)
  • 是否是HIGH memory区域(后面再讲),

每个不同的区域(zone)分别让buddy system algorithm来接管分配,

buddy system algorithm,即把页分为不同大小的block,每个block分别包含,1,2,4..1024个页,即2的n次方个页;

使用这buddy system algorithm是为了减少分页的外部碎片,而导致大的内存allocation请求却因内存的不连续即碎片原因而无法请求成功,如果把伙伴系统换为是普通的链表一样的管理,即free list,外部碎片会更加严重.

第二种分配方式,因为对于某些操作,4KB的页(64位是8KB)分配还是太大了,这些请求会用kalloc()来实现,kalloc会返回大于申请空间的物理上连续的内存,这种内存分配是最常见的,

当kmalloc请求分配的内存小于一个页的时候,请求会从slab layer里面获取,slab layer可以看成是内存池,slab layer 分为通用和专用两种,通用的可以用kmalloc来分配,而专用的则是一些经常创建删除的数据结构专用的cache,详情见下面

最后再介绍一种vmalloc,这种是返回逻辑上连续的而物理空间不连续的空间,较为少用,vmalloc分配内核虚拟地址必须更新内核页表,内核也有一个名为init_mm的mm_strcut结构来描述内核地址空间,详情见参考资料12

详细介绍部分

buddy system algorithm

TODO

slab layer

这里是通过slab layer中维护一个cache来实现的,cache中有malloc_size表,指向26个大小是32,64一直到131072大小的区域的相关结构(cache descriptor),它防止碎片的方法与buddy system algorithm几乎一样,这里可以想象一下如果不用slab layer来维护而是用free list会有什么坏处(当然是外部碎片啦)

而这里的slab layer其实不止这一种cache(要区分开CPU的高速缓存),slab layer还有其他cache是专门存储其他slab的,slab里有若干段连续的内存空间用来分配给固定object,这里就要引出另一种内存分配方式,是给那些大量创建删除的对象,很容易想到,文件系统的inode,dentry(directory entry),进程空间分配的memory descriptor(即mm_struct)和进程的process descriptor和task_struct、file_struct,都是这种类型的,这里的slab像是一个内存池,不会主动去释放里面的内存空间,而是像内存池一样,要用到再取出,这里取出的方式也有讲究,优先把没被用光的取出,没有再去找新的没用过的空间

 

参考资料

  1. understanding the linux kernel

  2. Linux Kernel Development

  3. https://zhidao.baidu.com/question/584699763711904325.html

  4. https://blog.csdn.net/bullbat/article/details/7194794

  5. 伙伴算法的实现

  6. slab

  7. https://www.cnblogs.com/longchang/p/10749402.html

  8. https://juejin.im/post/5e633173518825494707f014上面的slab_layer图

  9. https://mp.weixin.qq.com/s?__biz=MzU1MTU3MjUxMg==&mid=2247490495&idx=3&sn=c916638696622bb8614e8d8c3181a145&chksm=fb8e1ef0ccf997e67e2ff3e76009d241a3e3924da6070fd62e67d197ca1281df7d7577146c96上面伙伴系统的图

  10. https://mp.weixin.qq.com/s/yXbUnesmoyhDyfRrQAmKsw

  11. https://juejin.im/post/5e633173518825494707f014 伙伴系统的图

  12. https://blog.csdn.net/CSDN_WHB/article/details/81251713 说了free_area ,说kmalloc太小就用slab分配

TODO

  1. APUE的slab

  2. https://mp.weixin.qq.com/s/tqNluv-PvDi2GCXnrJCfIA把这篇文章融入

  3. 内核分配的冷热区域

  4. uderstanding linux kernel323页末说的从buddy system的内部碎片free list会拿来干嘛用

  5. 这里讲的伙伴系统https://blog.csdn.net/gatieme/article/details/52420444

  6. 这里还有伙伴系统的代码https://blog.csdn.net/yang_chen_shi_wo/article/details/47024215

  7. 用户空间允许页面中断,而内核空间则不允许。(为什么内核不允许页面中断,只听说内核分配是实时分配的)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值