我试图了解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作为请求内存的开始。如果我们知道数组名称包含该数组的startig地址,那么我们分配的空间将超过请求的内存。即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;
}
您能帮我理解这一点吗?
最佳答案
谢谢
我现在明白了。
C99的灵活数组成员功能用于“ struct devres”结构定义。
关于c - devm_kzalloc问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26446971/