Проблем с 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 + размер.

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
Не е ясно какво питаш. Не разбирате ли как работят гъвкавите членове на масиви, известни още като структурни хакове?   -  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