内核中的malloc

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

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

编译器的错误信息是:

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

我该怎么办?

Solutions Collecting From Web of "内核中的malloc"

使用kmallocvmalloc来代替(也请参阅本文 )

请注意有关两种分配方法(kmalloc和kmem_cache或vmalloc)之间的区别:

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

如果你想达到最大的分配效率,那么对每种类型的结构使用你自己的kmem_cache是​​要走的路(这个策略的其他好处是能够从/ proc监视你的分配状态,更容易捕获内存泄漏) 。

vmalloc:分配多个页面。 您在内核空间中获得映射内存。 在幕后,它与用户空间相似 – 内核分配一堆页面并将它们映射到虚拟地址空间。 这个分配比kmalloc慢,内存访问可能会导致更多的开销。

你不能在内核中使用库。 没有任何。

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

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

内核定义的标准C库也有一些函数, 这是为了方便。

它确实例如定义了snprintf

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

的确,你应该使用kmalloc和朋友,检查linux内核的例子。 例如: http : //lxr.linux.no/linux+v3.0/drivers/infiniband/hw/mthca/mthca_provider.c#L1033

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

  1. 用户空间库 – malloc()

  2. 系统调用 – brk()

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

所以如果你已经在第三步,编写内核模块,那么回去就没有意义了。 所以你只需要使用内核例程来进行内存分配。