内存管理---分配内存常用函数(用到DMA机制时的分配方法:返回虚拟地址和物理地址)

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_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.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/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 

原文地址:https://www.cnblogs.com/axjlxy/p/8976181.html

时间: 2024-11-09 02:15:43

内存管理---分配内存常用函数(用到DMA机制时的分配方法:返回虚拟地址和物理地址)的相关文章

内存管理:内存泄漏和空悬指针

********内存管理基础********************* 内存管理:针对的是实例的内存占用的管理(放在堆里面) 实例:1:由class类型构建的实例,2:闭包对象 内存管理技术:ARC:Automatic Reference Count 自动:由语言本身帮我们销毁内存,不需要你手动销毁, 比如在c中就调用dealloc() 引用:let p = Person()  p就是对Person()这个对象的一个引用 计数: let p = Person() //一个 / / let pp

Linux内存管理 (一) 内存组织

内存管理是内核最复杂同时也是最重要的一部.其特点在于非常需要处理器和内核之间的协作. 首先内存划分为结点,在内核中表示为pg_data_t,每个结点划分为内存域. 以下的所有数据结构或代码都做了不同程度的精减,一方面是为了保留相关代码,除去细枝末叶,另一方面是为了美观. 结点的数据结构为 <mmzone.h>typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; /*内存结点所包含的内存域数组*/ struct zo

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改

内存管理之内存池概述(转)

原文链接:http://www.xiaoyaochong.net/wordpress/index.php/2013/08/10/%E5%BC%95%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E4%B9%8B%E5%86%85%E5%AD%98%E6%B1%A0%E6%A6%82%E8%BF%B0/ 在我们编写代码的过程中,不可避免的要和内存打交道,在申请释放不太频繁的情况下,通常让系统进行内存管理即可.但是,直接使用系统调用malloc/free.new/delet

浅谈C语言内存管理、内存泄露、堆栈

1.内存分配区间: 对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text).数据段(.data).静态区(.BSS).堆和栈组成. BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始

内存管理 浅析 内存管理/内存优化技巧

内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验.如何让回收那些不再使用的对象呢?本文着重介绍OC中的内存管理. 所谓内存管理,就是对内存进行管理,涉及的操作有: 1.分配内存:比如创建一个对象,会增加内存占用: 2.清除内存:比如销毁一个对象,会减少内存占用. 内存管理的管理范围: 1.任何继承了NSObject的对象: 2.对其他非对象类

Java的内存管理与内存泄露

作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.OutOfMemoryError为止.经过分析Java内存泄漏是破坏系统的主要因素.这里与大家分享我们在开发过程中遇到的Java内存泄漏的检测和处理解决过程. 本文先介绍Java的内存管理,以及导致Java内存泄露的原因. 一. Java是

C存储类、链接和内存管理--动态分配内存及类型限定词

目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restrict关键字 @ 存储类说明符 C中存储类说明符共有5个,为auto register static extern typeddef,最后一个关键字typedef与内存存储无关. 规定:不可以在一个声明中使用一个以上存储类说明符. 存储类说明符用来确定变量的存储类型. 存储类和函数 函数的存储类有两

Objective-C 【内存管理&amp;手动内存管理 综述】

------------------------------------------- 内存管理 (1)Objective-C的内存管理 栈区    存放局部变量(由于基本数据类型占用的存储空间是固定的,由系统去分配,我们不用去管,故栈区存放基本数据类型,) 堆区    存放程序运行过程中动态分配的内存空间(对象类型是程序运行过程中动态分配的,他们的大小不固定.比如说是我们Person new申请来的,存放在堆区,也是我们需要管理的) ★所以内存管理的范围是   继承了NSObject的所有对象