前言
在进行驱动开发时,需要使用malloc
等函数,导入C库<stdlib.h>
出现bug。
嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦!
行文目录
- 前言
- 问题
- 解决
- 参考资料
问题
在写内核驱动的时候要使用malloc分配内存,然后报错如下所示:
// 链表初始化,构建一个头节点
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,函数原型如下:
/*
* @description: 内核中的内存分配函数
* @param-size : 申请的内存大小
* @param-flags: 分配内存的方式
* GFP_ATOMIC --表明分配内存的过程是原子的,不会被高优先级的进程或者中断打断
* GFP_KERNEL – 常规分配
* GFP_DMA – 给DMA分配内存时使用,使用该标志时分配的虚拟地址和物理地址都是连续的
* @return : 无
*/
void *kmalloc(size_t size, gfp_t flags)
kzalloc是对kmalloc的封装,在分配完内存后对分配的内存清零
/*
* @description: 释放内存
* @param-objp : 要释放对象的地址
* @return : 无
*/
void kfree(const void *objp);
/*
* @description: 分配内存
* @param-size : 要分配的内存大小
* @return : 无
*/
void *vmalloc(unsigned long size);
/*
* @description: 释放内存
* @param-size : 要释放的内存大小
* @return : 无
*/
void vfree(const void *addr);
因此改成如下所示,用kmalloc
替换malloc
即可,当然后面free
释放也要换成对应的kfree
。
// 链表初始化,构建一个头节点
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;
}
对了,还得用一下头文件:
#include <linux/slab.h>
参考资料
Linux内核内存分配函数kmalloc、kzalloc和vmalloc