当我尝试在内核模块中使用malloc
,我从编译器中收到一条错误消息。 我的代码:
res=(ListNode*)malloc(sizeof(ListNode));
编译器的错误信息是:
/root/ex3/ex3mod.c:491: error: implicit declaration of function 'malloc'
我该怎么办?
使用kmalloc
或vmalloc
来代替(也请参阅本文 )
请注意有关两种分配方法(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
你可以想象它像一个三步过程:
用户空间库 – malloc()
系统调用 – brk()
内核内核 – kmalloc / vmalloc / gfp等例程的内存管理器
所以如果你已经在第三步,编写内核模块,那么回去就没有意义了。 所以你只需要使用内核例程来进行内存分配。