devm_xxx机制
前言
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采用零长数组的方式实现。
参考
- The managed resource API
- Move resources allocated using unmanaged interface to managed devm interface
完!
2014年6月
devm_xxx机制的更多相关文章
- devm_xxx机制【转】
		前言 devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收.参考内核文档devres.txt.总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题.这些资源的释放 ... 
- 笔记:Binder通信机制
		TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ... 
- JAVA回调机制(CallBack)详解
		序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ... 
- 谈谈DOMContentLoaded:Javascript中的domReady引入机制
		一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ... 
- 路由的Resolve机制(需要了解promise)
		angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ... 
- Android权限管理之Permission权限机制及使用
		前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ... 
- Java学习之反射机制及应用场景
		前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ... 
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
		配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ... 
- Go结构体实现类似成员函数机制
		Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ... 
随机推荐
- [剑指Offer] 56.删除链表中重复的结点
			题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ... 
- 【python】Python 之 __new__() 方法与实例化
			本文转自:http://www.cnblogs.com/ifantastic/p/3175735.html __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 ... 
- 【bzoj2834】回家的路  分层图最短路
			题目描述 输入 输出 样例输入 2 1 1 2 1 1 2 2 样例输出 5 题解 分层图最短路 dis[i][0]表示到i为横向时起点到i的最短路,dis[i][1]表示到i为纵向时起点到i的最短路 ... 
- BZOJ4737 组合数问题(卢卡斯定理+数位dp)
			不妨不管j<=i的限制.由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i.容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j> ... 
- I/O复用----select
			2018-07-31 (星期二)I/O复用: 一个应用程序通常需要服务一个以上的文件描述符. 例如stdin,stdout,进程间通信以及若干文件进行I/O,如果不借助线程的话,(线程通常 ... 
- HDU5115:Dire Wolf——题解+翻译
			http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:给n匹狼,每一次攻击可以秒杀一匹狼,但同时会受到这匹狼的a攻击和它相邻两只狼的b攻击. 给定a, ... 
- React的getDefaultProps和getInitialState
			getDefaultProps 不是获取默认props,而是设置默认props,主要用在ES5的React写法中getInitialState 不是获取默认State,而是设置初始的state,主要是 ... 
- apache的作用和tomcat的区别
			经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料,总 ... 
- POJ3468:A Simple Problem with Integers(线段树模板)
			A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 149972 ... 
- # Codeforces Round #529(Div.3)个人题解
			Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ... 
