Linux 内核中的malloc
当我试图在内核模块中使用Linux 内核中的malloc,linux,unix,linux-kernel,Linux,Unix,Linux Kernel,当我试图在内核模块中使用malloc时,我从编译器得到一条错误消息。我的代码: res=(ListNode*)malloc(sizeof(ListNode)); 编译器错误消息为: /root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’ 我应该怎么做?使用或相反(另请参见)您不能在内核中使用库。一点也没有 这意味着您在内核中调用的任何函数都需要在内核中定义。Linux没有定义malloc,因此不能使用它
malloc
时,我从编译器得到一条错误消息。我的代码:
res=(ListNode*)malloc(sizeof(ListNode));
编译器错误消息为:
/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’
我应该怎么做?使用或相反(另请参见)您不能在内核中使用库。一点也没有 这意味着您在内核中调用的任何函数都需要在内核中定义。Linux没有定义malloc,因此不能使用它 有一个内存分配器和一系列内存分配函数。有关更多信息,请阅读内存分配器上的内核文档 顺便说一句,内核定义的一些函数也在标准C库中;这是为了方便
例如,它确实使用了kmalloc/kfree。您可以在内核源代码中grep malloc。请注意两种分配方法之间的差异-
kmalloc
和kmem\u cache
,或vmalloc
:
kmalloc
:最好用于小于页面的快速分配(页面大小,在大多数体系结构中为0x1000)。它不涉及内存映射,因此直接从内核的1:1物理内存映射中获取内存。你会得到物理上的偶然记忆。请注意,如果要分配多个页面(即订单>0),则可能会遇到外部碎片问题,即即使有足够的空闲空间,调用也可能失败。更高的阶数-分配失败的几率更高,而启动时间也是一个因素
如果您希望实现最大的分配效率,那么为每种类型的结构使用您自己的kmem\u缓存是一个不错的选择(此策略的其他好处是能够从/proc
监控分配的状态,并更容易捕获内存泄漏)
vmalloc
:分配多个页面。您可以在内核空间中获得映射内存。在幕后,它类似于用户空间得到的东西——内核分配一堆页面并将它们映射到虚拟地址空间中。此分配比kmalloc慢,内存访问可能会产生更多开销。确实,您应该使用kmalloc和friends,请查看linux内核以获取示例。例如。:
您可以将其想象为一个三步过程:
用户空间库-malloc()
系统调用-brk()
内核内部-内存管理器的kmalloc/vmalloc/gfp等例程
所以,如果您已经在第3步编写内核模块,那么返回将没有意义。因此,您只需要将内核例程用于内存分配。换句话说,我们都知道#include在内核中不存在我应该拥有什么include?或者vmalloc()
。内存分配在内核中的工作方式不同;这是一个完美的例子,说明了为什么只链接答案是个坏主意。这个答案在谷歌搜索“我可以在内核模块中使用malloc吗?”的顶部。