博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存管理-2---分配内存常用函数(按页分配)
阅读量:5348 次
发布时间:2019-06-15

本文共 3492 字,大约阅读时间需要 11 分钟。

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.o       #这是单文件的编译:上面两行是多文件的编译,更加方便  5   6 all:  7         make -C $(LINUX_SRC) M=`pwd` modules  8 clean:  9         make -C $(LINUX_SRC) M=`pwd` modules clean

mmc.c

Makefile  mmc1.c  mmc.c                                                                                                                                                                                                                                                                                          X  1 #include 
2 #include
3 #include
4 #include
5 #include
6 //内核代码工作在两种环境下: 7 // 1/中断上下文 不允许睡眠 8 // 2/进程上下文 允许睡眠 9 10 /* 11 内核中存放很多个page结构体都是连续的:page+1就是下一个page的地址 12 page 13 page 14 page 15 page 16 page 17 page 18 */ 19 20 static __init int test_init(void) 21 { 22 //申请大内存 23 struct page *pages,*page_4k; 24 char *v; 25 //GFP_KERNEL:再分配内存的时候允许睡眠 26 //GFP_ATOMIC:再分配内存的时候不允许睡眠 27 //申请2^n此方个page 28 //方式1 申请2个页 29 pages = alloc_pages(GFP_KERNEL,1); 30 //获取申请的物理内存的虚拟地址 31 v = page_address(pages); 32 //使用 33 memcpy(v,"111111",6); 34 printk("v1=%s\n",v); 35 printk("v1=%x\n",v); 36 //释放内存 37 __free_pages(pages,1); 38 39 //方式2 只是申请一个页4k 40 page_4k = alloc_page(GFP_KERNEL); 41 v = page_address(page_4k); 42 memcpy(v,"222222",6); 43 printk("v2=%s\n",v); 44 printk("v2=%x\n",v); 45 __free_pages(page_4k,0); 46 47 //方式3 申请2个页 48 v = (void*)__get_free_pages(GFP_KERNEL,1); 49 memcpy(v,"333333",6); 50 printk("v3=%s\n",v); 51 printk("v3=%x\n",v); 52 free_pages((unsigned long)v,1); 53 54 //方式4 下面只申请一个页 55 //__GFP_HIGH :在高端内存申请 56 pages = alloc_page(__GFP_HIGH); 57 //永久映射:会睡眠:所以这个方法只能在进程上下文使用 58 v = kmap(pages); 59 memcpy(v,"444444",6); 60 printk("v4=%s\n",v); 61 printk("v4=%x\n",v); 62 //高端内存需要自己解除映射,normal内存是内核自己映射的,不需要我们来解除映射 63 kunmap(pages); 64 __free_page(pages); 65 66 //方式5 临时映射:用完之后赶快释放,因为是环形缓存,有可能被覆盖掉 67 pages = alloc_page(__GFP_HIGH); 68 //不会睡眠:所以这个方法可以在中断上下文使用 69 //临时映射:速度快,用完之后赶快释放,因为是环形缓存,有可能被覆盖掉 70 v = kmap_atomic(pages); 71 memcpy(v,"555555",6); 72 printk("v5=%s\n",v); 73 printk("v5=%x\n",v); 74 //高端内存需要自己解除映射,normal内存是内核自己映射的,不需要我们来解除映射 75 __kunmap_atomic(v); 76 __free_page(pages); 77 78 printk("mmc init!\n"); 79 return 0; 80 } 81 static __exit void test_exit(void) 82 { 83 printk("mmc exit!\n"); 84 } 85 86 module_init(test_init); 87 module_exit(test_exit); 88 MODULE_LICENSE("GPL"); 89

board:

root@board liuye_dir#insmod mmc.ko [  165.700000] v1=111111[  165.700000] v1=ec44e000[  165.705000] v2=222222[  165.705000] v2=ecbcf000[  165.705000] v3=333333[  165.705000] v3=ec44e000[  165.705000] v4=444444[  165.705000] v4=ecbcf000[  165.705000] v5=555555[  165.705000] v5=ecbcf000[  165.705000] mmc init!root@board liuye_dir#rmmod mmc.ko [  167.770000] mmc exit!root@board liuye_dir#

 

转载于:https://www.cnblogs.com/axjlxy/p/8971201.html

你可能感兴趣的文章
双重标准,我该怎么解决
查看>>
python中的网页标签等字符处理
查看>>
Mybatis输入类型和结果类型
查看>>
Linux常用命令(五)
查看>>
Linux常用命令(四)
查看>>
Linux常用命令(六)
查看>>
Linux常用命令(六)
查看>>
Linux常用命令(八)
查看>>
Linux常用命令(七)
查看>>
Linux常用命令(九)
查看>>
Linux常用命令(十一)
查看>>
Linux常用命令(十)
查看>>
实验吧之这就是一个坑
查看>>
Linux常用命令(十二)
查看>>
Linux常用命令(十三)
查看>>
Linux常用命令(十五)
查看>>
Linux常用命令(十四)
查看>>
Linux常用命令(十七)
查看>>
Linux常用命令(十六)
查看>>
Linux常用命令(二十四)
查看>>