Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 内核中的malloc_Linux_Unix_Linux Kernel - Fatal编程技术网

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吗?”的顶部。