前言

  devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收。参考内核文档devres.txt。总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题。这些资源的释放会在device对象销毁时自动释放。

devres使用

  不同的内核模块提供了对应的devm_xxx接口,如下(不仅仅这些):

MEM
devm_kmalloc()
devm_kzalloc()
devm_kcalloc()
devm_kmalloc_array()
devm_kstrdup()
devm_kfree() IIO
devm_iio_device_alloc()
devm_iio_device_free()
devm_iio_trigger_alloc()
devm_iio_trigger_free()
devm_iio_device_register()
devm_iio_device_unregister() IO region
devm_request_region()
devm_request_mem_region()
devm_release_region()
devm_release_mem_region() IRQ
devm_request_irq()
devm_free_irq() DMA
dmam_alloc_coherent()
dmam_free_coherent()
dmam_alloc_noncoherent()
dmam_free_noncoherent()
dmam_declare_coherent_memory()
dmam_pool_create()
dmam_pool_destroy() PCI
pcim_enable_device() : after success, all PCI ops become managed
pcim_pin_device() : keep PCI device enabled after release IOMAP
devm_ioport_map()
devm_ioport_unmap()
devm_ioremap()
devm_ioremap_nocache()
devm_iounmap()
devm_ioremap_resource() : checks resource, requests memory region, ioremaps
devm_request_and_ioremap() : obsoleted by devm_ioremap_resource()
pcim_iomap()
pcim_iounmap()
pcim_iomap_table() : array of mapped addresses indexed by BAR
pcim_iomap_regions() : do request_region() and iomap() on multiple BARs REGULATOR
devm_regulator_get()
devm_regulator_put()
devm_regulator_bulk_get()
devm_regulator_register() CLOCK
devm_clk_get()
devm_clk_put() PINCTRL
devm_pinctrl_get()
devm_pinctrl_put() PWM
devm_pwm_get()
devm_pwm_put() PHY
devm_usb_get_phy()
devm_usb_put_phy() SLAVE DMA ENGINE
devm_acpi_dma_controller_register() SPI
devm_spi_register_master()

内核提供了devres_xxx的机制,并基于devres_xxx又给出了devres group机制。devres group主要用于处理初始化的时候,有多种资源类型需要初始化,每种资源类型的初始化又由多个devres_xxx资源申请组成的情况,将这些devres_xxx按类别组合成group,这样在需要显示释放某一类的资源时,调用devres group的api即可实现。内核给出的例子:

  if (!devres_open_group(dev, NULL, GFP_KERNEL))//启动group
return -ENOMEM; acquire A;//申请资源A
if (failed)
goto err; acquire B;//申请资源B
if (failed)
goto err;
... devres_remove_group(dev, NULL);//如果一切顺利,那么关掉group
return 0; err:
devres_release_group(dev, NULL);//如果出错,那么释放掉启动group后所有申请的资源
return err_code;

实现原理

具体的实现很简单,当然我们应该也能猜测到。在分配内存的时候,会分配比我们要求大的空间,空间的前面部分用于存放实现devres机制的数据结构,然后返回的是用户期望的空间的指针(该指针是实际分配的空间指针的devres结构的偏移)。


struct devres_node {
struct list_head entry;//通过该成员,挂接到device的devres链表上
dr_release_t release;//对应的资源释放回调
}; struct devres {
struct devres_node node;
/* -- 3 pointers */
unsigned long long data[]; /* guarantee ull alignment *///实际的数据部分
};

devres采用零长数组的方式实现。

参考

完!

2014年6月

devm_xxx机制的更多相关文章

  1. devm_xxx机制【转】

    前言 devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收.参考内核文档devres.txt.总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题.这些资源的释放 ...

  2. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  3. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  4. 谈谈DOMContentLoaded:Javascript中的domReady引入机制

    一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...

  5. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  6. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  7. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  8. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  9. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

随机推荐

  1. SQL局部变量

    声明局部变量 局部变量的声明需要使用declare 语句.并且必须以@开头 declare { @varaible_name datatype[,...n] } varaible_name :局部变量 ...

  2. 当提交的表单类型为multipart/form-data时 后台的dopost则不能使用 setCharset来进行解码了 需要单独对字段使用 原始的new String(req.name("ISO-8859-1"),"utf-8")形式解码了

    当提交的表单类型为multipart/form-data时 后台的dopost则不能使用 setCharset来进行解码了 需要单独对字段使用 原始的new String(req.name(" ...

  3. el语句 的 变量只能从域对象中获取 所以需要先添加到域对象

    el语句 的 变量只能从域对象中获取 所以需要先添加到域对象

  4. [SOJ #47]集合并卷积

    题目大意:给你两个多项式$A,B$,求多项式$C$使得:$$C_n=\sum\limits_{x|y=n}A_xB_y$$题解:$FWT$,他可以解决形如$C_n=\sum\limits_{x\opl ...

  5. BZOJ3709 [PA2014]Bohater 【贪心】

    题目链接 BZOJ3709 题解 贪心很显然 我们先干掉能回血的怪,当然按照\(d\)升序顺序,因为打得越多血越多,\(d\)大的尽量往后打 然后再干掉会扣血的怪,当然按照\(a\)降序顺序,因为最后 ...

  6. STL之七:STL各种容器的使用时机详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8550235 C++标准程序库提供了各具特长的不同容器.现在的问题是:该如何选择最佳的 ...

  7. ACE日志系统

    引用于:http://blog.csdn.net/focusonace/article/details/3108873 http://peirenlei.iteye.com/blog/305036 介 ...

  8. HDU 5641

    King's Phone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  9. hdu 5625

    Clarke and chemistry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  10. Educational Codeforces Round 6 B

    B. Grandfather Dovlet’s calculator time limit per test 1 second memory limit per test 256 megabytes ...