`kvmalloc`是Linux内核中的一个函数,用于在内核虚拟地址空间中分配连续的内存。与`vmalloc`不同,`kvmalloc`分配的内存是连续的,因此可以用作DMA缓冲区或其他需要连续内存的场景。
`kvmalloc`函数的原型如下:
void *kvmalloc(size_t size, gfp_t flags);
其中,`size`是要分配的内存大小,`flags`是内存分配标志。`gfp_t`是一个枚举类型,用于指定内存分配的行为。例如,`GFP_KERNEL`表示在内核内存区域分配内存,`GFP_ATOMIC`表示在原子上下文中分配内存。
以下是一个简单的示例,展示了如何在Linux内核中使用`kvmalloc`:
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/vmalloc.h>
static int __init my_module_init(void) {
void *buffer;
size_t size = 4096;
printk(KERN_INFO "Module init\n");
buffer = kvmalloc(size, GFP_KERNEL);
if (!buffer) {
printk(KERN_ERR "Failed to allocate memory\n");
return -ENOMEM;
}
memset(buffer, 0, size);
printk(KERN_INFO "Allocated %zu bytes at %p\n", size, buffer);
kvfree(buffer);
return 0;
}
static void __exit my_module_exit(void) {
printk(KERN_INFO "Module exit\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
在这个示例中,我们使用`kvmalloc`在内核虚拟地址空间中分配了一个大小为4096字节的连续内存缓冲区。然后,我们使用`memset`将缓冲区清零,并打印缓冲区的地址。最后,我们使用`kvfree`释放缓冲区。