Я пытаюсь понять реализацию функции 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;
}
Не могли бы вы помочь мне понять это.