内核中的malloc

yoa*_*str 9 unix linux linux-kernel

当我尝试malloc在内核模块中使用时,我从编译器收到错误消息.我的代码:

res=(ListNode*)malloc(sizeof(ListNode));
Run Code Online (Sandbox Code Playgroud)

编译器错误消息是:

/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

kni*_*ttl 20

使用kmallocvmalloc代替(见)

  • 这些联系已经死了; 完美的例子,为什么仅链接答案是一个坏主意.这个答案是谷歌搜索的顶部,"我可以在内核模块中使用malloc吗?". (5认同)

Dan*_*oni 16

注意两种分配方法之间的区别 - kmallockmem_cache,或vmalloc:

kmalloc:最适用于小于页面的快速分配(大多数体系结构上的PAGE_SIZE,0x1000).它不涉及映射内存,因此您可以直接从内核的1:1物理内存映射中获取内存.你得到身体上的偶然记忆.请注意,如果您要分配多个页面(即订单> 0),则可能会遇到外部碎片问题 - 即即使有足够的空闲,呼叫也可能会失败.更高的顺序 - 更高的分配失败机会,以及正常运行时间也是一个因素.

如果你想实现最大的分配效率,那么就可以使用你自己kmem_cache的每种类型的结构(这个策略的其他好处是能够/proc更容易地监视你的分配状态并捕获内存泄漏).

vmalloc:分配多个页面.你在内核空间得到映射内存.在幕后,它类似于用户空间 - 内核分配一堆页面并将它们映射到虚拟地址空间.这种分配比kmallocs 慢,内存访问可能会产生更多的开销.


Mar*_*rkR 7

您不能在内核中使用库.没有任何.

这意味着您在内核中调用的任何函数都需要在内核中定义.Linux没有定义malloc,因此你无法使用它.

有一个内存分配器和一系列内存分配函数.有关更多信息,请阅读内存分配器上的内核文档.

在内部,内核定义了一些函数,它们也在标准C库中; 这是为了方便.

例如,它定义了snprintf