zoukankan      html  css  js  c++  java
  • 内存管理-3---分配内存常用函数(按字节分配)

    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
    ",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!
    ");
     56 }
     57 
     58 module_init(test_init);
     59 module_exit(test_exit);
     60 MODULE_LICENSE("GPL");
    有时候,不小心知道了一些事,才发现自己所在乎的事是那么可笑。
  • 相关阅读:
    Git 远程仓库分支管理
    Git 本地仓库管理
    Git 本地仓库管理
    SQLAlchemy_定义(一对一/一对多/多对多)关系
    SQLAlchemy_定义(一对一/一对多/多对多)关系
    自动化生成 Openstack 新项目开发框架
    自动化生成 Openstack 新项目开发框架
    Python 数据结构_队列
    Python 数据结构_队列
    Python 数据结构_堆栈
  • 原文地址:https://www.cnblogs.com/axjlxy/p/8976174.html
Copyright © 2011-2022 走看看