1. 程式人生 > >內存管理---分配內存常用函數(按字節分配)

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

隨機 page process 進程上下文 return print 上下文 class 集中

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_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");

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