Опитвам се да разбера изпълнението на функцията 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;
}
Бихте ли ми помогнали да разбера това.