Проблема с devm_kzalloc

Я пытаюсь понять реализацию функции 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 + size.

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;
}

Не могли бы вы помочь мне понять это.


person user3693586    schedule 19.10.2014    source источник
comment
Не понятно, что вы спрашиваете. Разве вы не понимаете, как работают гибкие члены массива AKA struct hacks?   -  person Andrew C    schedule 19.10.2014
comment
какая польза от unsigned long long data[] при распределении ресурсов. Как его можно использовать в качестве начального адреса запрошенной памяти.   -  person user3693586    schedule 19.10.2014
comment
Это гибкий элемент массива или структурный хак. Просто ищите в любое время, и вы найдете все виды вещей   -  person Andrew C    schedule 19.10.2014
comment
Память не будет выделена для гибкого элемента массива?   -  person user3693586    schedule 19.10.2014
comment
вот для чего нужен параметр дополнительного размера   -  person Andrew C    schedule 19.10.2014
comment
Прошу прощения, не смог ясно понять. будет выделена дополнительная память, чем требуется.   -  person user3693586    schedule 19.10.2014
comment
Не точная копия; Просмотрите ответы на этот вопрос, чтобы понять, как неполный/гибкий массив член в структуре предназначен для использования..   -  person TheCodeArtist    schedule 19.10.2014


Ответы (1)


Спасибо

Я понял сейчас.

Его гибкая функция члена массива C99, используемая в определении структуры «struct devres».

person user3693586    schedule 22.10.2014