kmalloc和slab是Linux内核中用于分配内存的两个函数。kmalloc用于分配小块内存,而slab用于分配大块内存,且slab比kmalloc更高效。
在Linux内核中,kmalloc会调用kmem_cache_alloc函数来从slab中申请内存。这是因为kmalloc需要频繁地申请小块内存,而每次从内存池中分配内存的开销较大。因此,kmem_cache_alloc会将一块内存分成多个slab,每个slab存放固定大小的块。当需要申请内存时,kmem_cache_alloc会从相应的slab中分配一个块。如果slab中没有块可用,则会尝试从一级内存池中分配一个新的slab。
下面是一个简单的示例代码,展示了如何使用kmalloc和slab进行内存分配:
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/slab.h>
static int *int_ptr;
static int __init example_init(void){
int_ptr=(int *)kmalloc(sizeof(int),GFP_KERNEL);
if(!int_ptr){
printk(KERN_INFO "kmalloc allocation failed\n");
return -ENOMEM;
}
*int_ptr=10;
printk(KERN_INFO "kmalloc allocation successful.\n");
return 0;
}
static void __exit example_exit(void){
kfree(int_ptr);
printk(KERN_INFO "kmalloc deallocation successful.\n");
}
module_init(example_init);
module_exit(example_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple example Linux module.");