【问题标题】:malloc in kernel内核中的malloc
【发布时间】:2010-05-22 14:22:24
【问题描述】:

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

res=(ListNode*)malloc(sizeof(ListNode));

编译器错误信息是:

/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’

我该怎么办?

【问题讨论】:

  • 换句话说,我们都知道#include 在内核中不存在,我应该包含什么?

标签: linux unix linux-kernel


【解决方案1】:

请改用kmallocvmalloc(另请参阅this

【讨论】:

  • vmalloc()。内存分配在内核中的工作方式不同。
  • 这些链接已失效;为什么仅链接答案是一个坏主意的完美示例。这个答案在谷歌搜索“我可以在内核模块中使用 malloc 吗?”的顶部。
【解决方案2】:

注意两种分配方式的区别——kmallockmem_cache,或者vmalloc

kmalloc:最适合用于小于一页的快速分配(PAGE_SIZE,在大多数架构上为 0x1000)。它不涉及内存映射,因此您可以直接从内核的 1:1 物理内存映射中获取内存。你会得到物理上的偶然记忆。请注意,如果您想分配 超过 一页(即 order > 0),则可能会遇到外部碎片问题 - 即即使有足够的空闲,调用也可能会失败。高阶 - 分配失败的可能性更高,正常运行时间也是一个因素。

如果您想获得最大的分配效率,那么为每种类型的结构使用您自己的 kmem_cache 是可行的方法(此策略的其他好处是能够从 /proc 和更容易发现内存泄漏)。

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

【讨论】:

    【解决方案3】:

    您不能在内核中使用库。什么都没有。

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

    有一个内存分配器和一系列内存分配函数。阅读有关内存分配器的内核文档以获取更多信息。

    顺便说一句,内核定义的一些函数也在标准 C 库中;这是为了方便。

    例如,它确实定义了snprintf

    【讨论】:

      【解决方案4】:

      使用 kmalloc/kfree。您可以在内核源代码中grep malloc。

      【讨论】:

        【解决方案5】:

        你可以把它想象成一个三步过程:

        1. 用户空间库 - malloc()

        2. 系统调用 - brk()

        3. 内核内部 - 内存管理器的 kmalloc/vmalloc/gfp 等例程

        因此,如果您已经在第 3 步,编写内核模块,那么返回没有意义。所以你只需要使用内核例程来分配内存。

        【讨论】:

          【解决方案6】:

          确实,您应该使用 kmalloc 和朋友,查看 linux 内核以获取示例。例如。: http://lxr.linux.no/linux+v3.0/drivers/infiniband/hw/mthca/mthca_provider.c#L1033

          【讨论】:

            猜你喜欢
            • 2017-01-10
            • 2011-08-08
            • 2020-01-31
            • 2013-01-06
            • 2021-12-06
            • 2013-05-27
            • 1970-01-01
            • 2010-12-13
            • 1970-01-01
            相关资源
            最近更新 更多