0%

内核devres接口分析

介绍

devres(Device resource)设备管理资源,是一个内核设施,通过自动释放驱动程序中分配的资源来帮助开发人员。它简化了init/probe/open函数中的错误处理。使用Devres,每个资源分配器都有自己的托管版本,负责资源的 release 和 free。Devres由一个与struct设备相关联的任意大小内存区域的链表组成。每个devres资源分配器将已分配的资源插入到列表中。资源一直是可用的,直到代码手动释放它,或当设备从系统中分离,或当驱动程序被卸载。每个devres条目都与一个release函数相关联。释放devres有不同的方法。无论如何,所有devres条目在驱动分离时被释放。在释放时,将调用相关的release函数,然后释放devres条目。

下面是驱动程序可用的资源列表:

  • 用于私有数据结构的内存
  • 中断(IRQs)
  • 内存区域分配(request_mem_region())
  • 内存区域I/O映射(ioremap())
  • 缓冲内存(可能带有DMA映射)
  • 不同的框架数据结构: clocks,GPIOs, PWMs, USB phy, regulators, DMA等等

devres函数接口描述

devres结构体

1
2
3
4
5
struct devres {
struct devres_node node;
/* -- 3 pointers */
unsigned long long data[]; /* guarantee ull alignment */
};

API - devres_alloc函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static inline void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp) 
{
return devres_alloc_node(release, size, gfp, NUMA_NO_NODE);
}


/**
* devres_alloc - Allocate device resource data
* @release: Release function devres will be associated with
* @size: Allocation size
* @gfp: Allocation flags
* @nid: NUMA node
*
* Allocate devres of @size bytes. The allocated area is zeroed, then
* associated with @release. The returned pointer can be passed to
* other devres_*() functions.
*
* RETURNS:
* Pointer to allocated devres on success, NULL on failure.
*/
void * devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid)
{
struct devres *dr;

dr = alloc_dr(release, size, gfp | __GFP_ZERO, nid);
if (unlikely(!dr))
return NULL;
return dr->data;
}
EXPORT_SYMBOL_GPL(devres_alloc_node);

API