我正在尝试了解 devm_kzalloc() 函数的实现。它分配的内存超过了请求的内存(sizeof(struct devres) + size) 来管理资源。
struct devres 定义如下,第二个成员是一个不完整的数组。
struct devres {
struct devres_node node;
/* -- 3 pointers */
unsigned long long data[]; /* guarantee ull alignment */
};
以下是分配内存的来源。
size_t tot_size = sizeof(struct devres) + size;
struct devres *dr;
dr = kmalloc_track_caller(tot_size, gfp);
if (unlikely(!dr))
return NULL;
memset(dr, 0, tot_size);
INIT_LIST_HEAD(&dr->node.entry);
dr->node.release = release;
return dr;
我有以下疑问。. 它正在计算 tot_size,但在 struct devres 中,数组不完整。. devm_kzalloc() 函数(如下所示)返回 dr->data 作为请求内存的开始。如果我们知道数组名称包含该数组的起始地址,那么我们分配的内存比请求的内存要多。即 unsigned long long + 大小的大小。
void * devm_kzalloc(struct device *dev, size_t size, gfp_t gfp)
{
struct devres *dr;
/* use raw alloc_dr for kmalloc caller tracing */
dr = alloc_dr(devm_kzalloc_release, size, gfp);
if (unlikely(!dr))
return NULL;
set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
devres_add(dev, dr->data);
return dr->data;
}
你能帮我理解这一点吗?