這裏面的方法是:在內存中建立一個常常用的或者專用的一個緩存:這個緩存的分紅若干個大小同樣的小緩存,每次申請釋放的都是一個個小緩存,這裏所說的釋放,實際上沒有釋放,而是歸還,至關於slab系統中的專用緩存一個道理.linux
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.capp
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!\n"); 58 } 59 60 module_init(test_init); 61 module_exit(test_exit); 62 MODULE_LICENSE("GPL");