这里面的方法是:在内存中创建一个经常用的或者专用的一个缓存:这个缓存的分成若干个大小一样的小缓存,每次申请释放的都是一个个小缓存,这里所说的释放,实际上没有释放,而是归还,相当于slab系统中的专用缓存一个道理.
makefile
1 LINUX_SRC :=/home/liuye/tiny4412/FriendlyARM_kernel/linux-3.5 2 #obj-m += module.o #生成module.ko 但我们写module.o就可以 3 #module-objs=param.o #这里写要编译文件 4 obj-m +=mmc_group.o #这是单文件的编译:上面两行是多文件的编译,更加方便 5 6 all: 7 make -C $(LINUX_SRC) M=`pwd` modules 8 clean: 9 make -C $(LINUX_SRC) M=`pwd` modules clean
mmc_group.c
1 #include <linux/init.h> 2 #include <linux/sched.h> 3 #include <linux/module.h> 4 #include <linux/mm.h> 5 #include <linux/highmem.h> 6 #include <linux/vmalloc.h> 7 #include <linux/dma-mapping.h> 8 #include <linux/slab.h> 9 //查找 10 //内核代码工作在两种环境下: 11 // 1/中断上下文 不允许睡眠 12 // 2/进程上下文 允许睡眠 13 14 /* 15 内核中存放很多个page结构体都是连续的:page+1就是下一个page的地址 16 page 17 page 18 page 19 page 20 page 21 page 22 */ 23 //在内核程序中,申请的内存一定不能有内存泄漏,用完要是放,不然内核就崩溃了. 24 //在应用程序中,如果申请的内存没有使放,越来越多,内核就会把这个进程杀掉,但是内核里面由内存泄漏是没有人可以把内核干掉的. 25 struct nrf_st 26 { 27 int no; 28 int flag; 29 char msg[16]; 30 }; 31 void ctor(void *data) 32 { 33 34 } 35 static __init int test_init(void) 36 { 37 struct kmem_cache *kmem; 38 struct nrf_st *nrf; 39 //my_cache:名字可体现在/proc/slabinfo里面 40 //第二个参数:每个结构体的大小,而不是申请总的内存的大小. 41 //第四个参数:按照硬件cache行对其 42 //ctor:再分配缓存中的每一个对象的时候都会调用,并且会把分配的对象的指针传给这个函数; 43 kmem = kmem_cache_create("my_cache",sizeof(struct nrf_st),0,SLAB_HWCACHE_ALIGN,ctor); 44 45 //获得缓存中的对象 46 nrf = kmem_cache_alloc(kmem,GFP_KERNEL); 47 48 //释放对象 49 kmem_cache_free(kmem,nrf); 50 51 //释放 52 kmem_cache_destroy(kmem); 53 return 0; 54 } 55 static __exit void test_exit(void) 56 { 57 printk("mmc exit! "); 58 } 59 60 module_init(test_init); 61 module_exit(test_exit); 62 MODULE_LICENSE("GPL");