解决驱动开发中<stdlib.h> no such file 的问题

前言

   在进行驱动开发时,需要使用malloc等函数,导入C库<stdlib.h>出现bug。

   嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦!

行文目录

问题

   在写内核驱动的时候要使用malloc分配内存,然后报错如下所示:

c 复制代码
// 链表初始化,构建一个头节点
pNode List_Init(void) {
    pNode Head = (pNode)malloc(sizeof(Node));
    if (Head == NULL) {
        perror("malloc failed!");
        return NULL;
    }

    INIT_LIST_HEAD(&Head->list);

    return Head;
}

解决

   这是因为malloc等函数属于用户空间,无法再内核空间中使用,内核空间中分配内存的函数应该是kmalloc,kzalloc和vmalloc,与之对应的释放内存的函数是kfree,vfree,函数原型如下:

c 复制代码
/*
 * @description: 内核中的内存分配函数
 * @param-size : 申请的内存大小
 * @param-flags: 分配内存的方式  
 * 				 GFP_ATOMIC --表明分配内存的过程是原子的,不会被高优先级的进程或者中断打断
 * 				 GFP_KERNEL -- 常规分配
 * 				 GFP_DMA -- 给DMA分配内存时使用,使用该标志时分配的虚拟地址和物理地址都是连续的
 * @return     : 无
 */
void *kmalloc(size_t size, gfp_t flags)

   kzalloc是对kmalloc的封装,在分配完内存后对分配的内存清零

c 复制代码
/*
 * @description: 释放内存
 * @param-objp : 要释放对象的地址
 * @return     : 无
 */
void kfree(const void *objp);
c 复制代码
/*
 * @description: 分配内存
 * @param-size : 要分配的内存大小
 * @return     : 无
 */
void *vmalloc(unsigned long size);
c 复制代码
/*
 * @description: 释放内存
 * @param-size : 要释放的内存大小
 * @return     : 无
 */
void vfree(const void *addr);

   因此改成如下所示,用kmalloc替换malloc即可,当然后面free释放也要换成对应的kfree

c 复制代码
// 链表初始化,构建一个头节点
pNode List_Init(void) {
    pNode Head = (pNode)kmalloc(sizeof(Node), GFP_ATOMIC);
    if (Head == NULL) {
        printk("malloc failed!");
        return NULL;
    }

    INIT_LIST_HEAD(&Head->list);

    return Head;
}

   对了,还得用一下头文件:

c 复制代码
#include <linux/slab.h>

参考资料

   Linux内核内存分配函数kmalloc、kzalloc和vmalloc

相关推荐
会编程的吕洞宾23 分钟前
DeepAgents In Action学习(Second)
android·java·学习
牛油果子哥q1 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客1 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
我爱cope1 小时前
【计算机网络 | 数据链路层7:VLAN:一台交换机如何划分多个逻辑局域网?】
网络·学习·计算机网络
智者知已应修善业1 小时前
【51单片机数码管逐位显示1-8余位不亮】2024-10-23
c语言·经验分享·笔记·嵌入式硬件·51单片机
babe小鑫1 小时前
2026信管专业学习数据分析的价值
学习·数据挖掘·数据分析
ysa0510302 小时前
c++常用自带函数用法与注意
c++·笔记·算法
tedcloud1232 小时前
book-to-skill 怎么部署?把技术书和项目文档变成 AI Agent 可复用知识
linux·运维·服务器·人工智能·开源
瀚高PG实验室2 小时前
SQL优化案例:使用分区表优化SQL查询性能
linux·服务器·数据库·sql·microsoft·postgresql
编程圈子2 小时前
电机驱动开发学习25. 弱磁控制与全速域增益调度
驱动开发·学习