С некоторого времени хранение данных во внешнем файле стало считаться нормальным и появлились удобные функции для работы с файлами. Естественно, т.к. модули ядра могут загружаться на старте операционной системы, то может сам файл не существовать по причине недозагрузки файловых систем.

Для работы с файлами из пространства ядра есть “ядерные” функции:

filp_open – открывает файл. Сейчас не нужно заморачиваться с пользовательскими данными и всё работает без переключения setfs и т.д.

filp_close – закрыли файл.

Для чтения / записи есть удобные функции kernel_read и kernel_write. Удобство эти функций заключается в явном указании позиции чтения/записи в момент операции. Никакие прыжки с установкой позиции не требуются. Также запись по смещению вне файла вполне логично расширяет файл – тоже не требуется никаких приседаний. Обе функции возвращают количество прочитанных/записанных байт.

Все функции работают с данными из пространства ядра.

Упражнения со структурами:

насколько понял, при объявлении структур в ядре средства #pragma pack не используются. Поэтому структуры объявляются явно со всеми паддингами. По поводу выравнивания полей в интернете есть рассуждения, что “настоятельно рекомендуется” 4-х байтные поля выравнивать на границу 4-х байт, 8-ми байтные – на границу 8 байт.

Для работы с порядком байт в ядре всё предусмотрено: есть типы __le16, __le32 и др. То же самое и для be. И есть функции типа cpu_to_le16, le16_to_cpu – в общем делают очевидные преобразования.