我试图了解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/

10-11 22:25
查看更多