0

我正在尝试了解 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;
}

你能帮我理解这一点吗?

4

1 回答 1

0

谢谢

我现在明白了。

其灵活的 C99 数组成员特性用于“struct devres”结构定义。

于 2014-10-22T16:29:32.563 回答