Linux内核malloc()与free_s()实现解析
"这篇文档详细解释了Linux内核中malloc()和free_s()函数的实现原理,特别是针对rk3328芯片的数据手册中的空闲存储桶描述符链表结构。文档描述了内存分配和回收的过程,以及内核内存管理的一些核心概念。" 在Linux内核中,内存管理是至关重要的部分,它确保了高效和可靠的内存分配。malloc()函数是动态内存分配的关键,它的执行流程如下: 1. **搜索目录**:malloc()首先会遍历内存分配目录,寻找适合请求大小的目录项。如果找到一个目录项的字节长度大于请求的大小,就认为这个目录项合适。如果遍历整个目录未找到合适的,说明请求过大。 2. **查找空闲描述符**:在找到的目录项对应的描述符链表中,malloc()会查找有空闲空间的描述符。如果发现描述符的空闲内存指针freeptr不为NULL,表示找到了可用的描述符。若未找到,需要创建新的描述符。 - **创建新描述符**:如果空闲描述符链表为空,首次调用malloc()时,会使用init_bucket_desc()初始化链表。然后从链表头取一个描述符,初始化其对象计数为0,大小为目录项指定的长度,并分配一个内存页面,设置描述符的page和freeptr指向该页面。 - **页面初始化**:接下来,根据对象长度初始化页面,建立一个对象链表,每个对象头部包含指向下一个对象的指针,最后一个对象的指针设为NULL。 - **插入描述符**:最后,将新创建的描述符插入到对应的目录项链表开始处。 3. **返回内存**:将描述符的freeptr复制给用户作为内存指针,然后更新freeptr指向下一个空闲对象的位置,同时增加描述符的引用计数。 free_s()函数负责内存的回收。它通过内存块地址计算出对应的页面地址,然后遍历目录找到匹配的描述符。释放的内存块会被添加到freeptr指向的空闲对象链表,描述符的引用计数减1。如果计数归零,表示页面已完全空出,可以释放页面并回收描述符到空闲描述符链表。 这个内存管理系统设计的目标是为了快速响应,允许在中断级别调用,尽管单个分配的最大限制是4KB,这是Linux中页面的大小。每个页面(或称为“存储桶”)的管理通过存储桶描述符实现,包含了指向下一个存储桶的指针、空闲内存指针、引用计数和页面大小等信息。 通过了解malloc()和free_s()的实现,可以深入理解Linux内核如何管理内存,这对于系统开发和调试是极其宝贵的。尽管这里讨论的是较旧的Linux内核版本0.11,但其基本原理仍然适用于现代内核,为理解Linux内存管理的核心机制提供了基础。
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/b8ca0c14e38a457f9fb5be3a2d5ce6ab_weixin_26776943.jpg!1)
- 粉丝: 33
- 资源: 3963
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)