內存管理-5---分配內存經常使用函數(分配固定大小的對象:slab)

這裏面的方法是:在內存中建立一個常常用的或者專用的一個緩存:這個緩存的分紅若干個大小同樣的小緩存,每次申請釋放的都是一個個小緩存,這裏所說的釋放,實際上沒有釋放,而是歸還,至關於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");
相關文章
相關標籤/搜索