內存管理-3---分配內存經常使用函數(按字節分配)

makefilelinux

  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_byte.o       #這是單文件的編譯:上面兩行是多文件的編譯,更加方便
  5 
  6 all:
  7         make -C $(LINUX_SRC) M=`pwd` modules
  8 clean:
  9         make -C $(LINUX_SRC) M=`pwd` modules clean
 10         

mmc_byte.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/slab.h>
  8 //查找
  9 //內核代碼工做在兩種環境下:
 10 //      1/中斷上下文  不容許睡眠
 11 //      2/進程上下文    容許睡眠
 12 
 13 /*
 14 內核中存放不少個page結構體都是連續的:page+1就是下一個page的地址
 15 page
 16 page
 17 page
 18 page
 19 page
 20 page
 21 */
 22 //在內核程序中,申請的內存必定不能有內存泄漏,用完要是放,否則內核就崩潰了.
 23 //在應用程序中,若是申請的內存沒有使放,愈來愈多,內核就會把這個進程殺掉,可是內核裏面由內存泄漏是沒有人能夠把內核幹掉的.
 24 static __init int test_init(void)
 25 {
 26         char *v;
 27         //curent:指針:指向這個進程的task_struct結構體:用來描述進程信息:comm進程名字
 28         printk("process:%s\n",current->comm);
 29         //打印出來的進程應該是insmod,由於insmod這個進程安裝了這段代碼   
 30         //方法1:
 31         //kmalloc:分配出來的內存裏面存放的數據是隨機的;
 32         //kzalloc:分配出來的內存裏面是被清零的;至關於kmalloc後memset();
 33         //kmalloc:kzalloc:分配的內存物理地址和虛擬地址都是連續的.換句話說,這個函數要求物理內存上有連續的空間,才能分配成功!
 34         //v = kmalloc(100,GFP_KERNEL);
 35         v = kzalloc(100,GFP_KERNEL);
 36         memcpy(v,"123",3);
 37         kfree(v);
 38 
 39         //方法2:
 40         //只能保證在虛擬地址上是連續的,把零散的物理內存,集中整理映射到虛擬內存上.固然物理內存也有多是連續的.可是咱們作事要嚴禁不能靠運氣.
 41         //vmalloc:函數是有可能睡眠的
 42         //vmalloc:分配出來的內存裏面存放的數據是隨機的;
 43         //vzalloc:分配出來的內存裏面是被清零的;至關於vmalloc後memset();
 44         //v = vmalloc(100);
 45         v = vzalloc(100);
 46         memcpy(v,"123",3);
 47         vfree(v);
 48 
 49 
 50 
 51         return 0;
 52 }
 53 static __exit void test_exit(void)
 54 {
 55         printk("mmc exit!\n");
 56 }
 57 
 58 module_init(test_init);
 59 module_exit(test_exit);
 60 MODULE_LICENSE("GPL");
相關文章
相關標籤/搜索