內存管理-4---分配內存經常使用函數(用到DMA機制時的分配方法:返回虛擬地址和物理地址)

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_v_p.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_v_p.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 static __init int test_init(void)
 26 {
 27         char *v;//虛擬地址
 28         dma_addr_t paddr;//物理地址
 29         //curent:指針:指向這個進程的task_struct結構體:用來描述進程信息:comm進程名字
 30         printk("process:%s\n",current->comm);
 31         //申請dma所要訪問的內存:NULL:這裏應該填寫設備類型,後面講解
 32         //通常聲卡驅動,framebuffer等須要dma硬件支持的驅動都須要用到這個函數
 33         v = dma_alloc_coherent(NULL,480*800*4,&paddr,GFP_KERNEL);
 34 
 35 
 36         //釋放:
 37         dma_free_coherent(NULL,480*800*4,v,paddr);
 38 
 39 
 40 
 41         return 0;
 42 }
 43 static __exit void test_exit(void)
 44 {
 45         printk("mmc exit!\n");
 46 }
 47 
 48 module_init(test_init);
 49 module_exit(test_exit);
 50 MODULE_LICENSE("GPL");
 51 
相關文章
相關標籤/搜索