В коде ядра легко допустить неприятную ошибку: выделить память под структуру, но случайно указать неправильный размер.
Компилятор может ничего не заметить, а проблема проявится уже во время работы. Например, когда код начнёт записывать данные за пределы выделенного участка.
⏺Как это работает с kmalloc
Обычно память под структуру выделяют так:
struct my_device *dev;
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
Здесь всё правильно. Но
kmalloc() получает только размер в байтах. Какой именно объект будет храниться в памяти, allocator не знает.Если разработчик ошибётся в
sizeof(), можно получить слишком маленький буфер.⏺Что меняет kmalloc_obj
Идея типизированного выделения - связать размер памяти непосредственно с типом объекта.
Вместо ручного указания размера используется выражение, по которому компилятор определяет нужный тип:
dev = kmalloc_obj(*dev, GFP_KERNEL);
Для массива предусмотрен аналогичный подход:
dev = kmalloc_objs(*dev, 16, GFP_KERNEL);
Так меньше шансов перепутать размер структуры или неправильно рассчитать память под несколько элементов.
⏺А что с защитой памяти
Важно понимать: типизированное выделение не превращает C в безопасный язык и не устраняет все ошибки работы с указателями.
Но оно убирает один источник проблем - несоответствие размера выделяемой памяти объекту, для которого она предназначена.
Особенно это полезно в kernel-коде, где подобная ошибка может закончиться повреждением памяти, а не просто падением одного приложения.
