前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux 内存分配流程及 kmalloc 解析

Linux 内存分配流程及 kmalloc 解析

作者头像
Jasonangel
发布2021-10-25 15:50:01
2.5K0
发布2021-10-25 15:50:01
举报

手把手教你分析 Linux 启动流程

上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。

在 start_kernel 内核初始化函数中,一共调用 86 个函数去初始化,其中有一个 mm_init 函数,用以初始化内存。

代码语言:javascript
复制
start_kernel
    |--->mm_init
        |--->mem_init

linux4.14/init/main.c

在 mem_init 函数中会初始化伙伴系统和 slab 分配器。

先说两个概念:

外部碎片:有一段小内存,夹在两个大内存中间,两个大内存已经被分配给进程,这一段小内存由于过小,不够申请者使用,就一直空闲。

内部碎片:一个进程申请了一段内存,可是这个进程从来没有全部使用,一直有最后的一段内存没有使用。

为了解决这两个问题,就出现了伙伴系统和 slab 分配器。伙伴系统解决外部碎片问题,slab 分配器解决内部碎片问题。

1、伙伴系统基于页分配,一次分配多页,这样就不会出现夹在中间的小内存。

2、slab 分配器基于字节来分配,特别适用于需要频繁分配几十个字节的结构体,我们经常使用的 kmalloc 就是基于 slab 分配器。

3、其实所有的分配方式最底层都是伙伴系统,它先分配好一段大的内存,然后 slab 再从其中分配小的内存。

具体分析请看链接:

https://www.cnblogs.com/arnoldlu/p/8251333.html

这里列出了常见的内存分配 API 接口。

其中最常用的就是 malloc 和 kmalloc,区别在于一个在用户空间,一个在内核空间,并且 kmalloc 的使用需要注意竞争,需要指明 flag 。

代码语言:javascript
复制
void *kmalloc(size_t size, int flags);

内核编程(驱动编程)一定要注意竞争问题,重要的数据或者内存使用前后一定要加锁。

在 kmalloc 的使用过程中,常用标志位:GFP_KERNEL、GFP_ATOMIC、GFP_USER、GFP_HIGHUSER、GFP_NOIO、GFP_NOFS。

前两个最常用,GFP_KERNEL 代表在使用 kmalloc 分配内存时,如果内存准备不足,会等待,也就是会睡眠。GFP_ATOMIC 代表使用 kmalloc 分配内存时,如果内存准备不足,会立刻返回,不会引起睡眠,适合在中断上下文或者进程上下文中使用。

补充:

1、基于 slab 分配器,出现了 slob 和 slub 分配器。在多核大系统大内存中,一般使用 slub 分配器,在极小的嵌入式系统中,一般使用 slob 分配器(只有600多行代码)。

2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用。

bootmem 分配器按块进行分配,颗粒度很大,不够精细,比较浪费内存。bootmem 分配器只会在 start_kernel 函数和mm_init 函数之前存在,中间的函数会调用它进行内存分配。

代码语言:javascript
复制
start_kernel
    |--->setup_arch
        |--->paging_init
            |--->bootmem_init

·················· END ··················

点击关注公众号,免费领学习资料

欢迎大家关注我的微信公众号,定期给大家分享 C 语言、单片机、嵌入式 Linux、代码人生相关文章。公众号内回复【电子书】即可获得嵌入式全套500 本全套电子书。回复【入群】即可加入嵌入式技术交流群。回复【pdf】即可获得博主总结的上百页嵌入式笔试面试题目精选汇总。

我创建了知识星球,欢迎大家扫码加入。在知识星球中有问必答。提供全套的嵌入式学习规划、嵌入式学习资料、简历指导、嵌入式求职规划、嵌入式笔试面试指导、公司推荐等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式Linux系统开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档