С некоторого времени хранение данных во внешнем файле стало считаться нормальным и появлились удобные функции для работы с файлами. Естественно, т.к. модули ядра могут загружаться на старте операционной системы, то может сам файл не существовать по причине недозагрузки файловых систем.
Для работы с файлами из пространства ядра есть “ядерные” функции:
filp_open – открывает файл. Сейчас не нужно заморачиваться с пользовательскими данными и всё работает без переключения setfs и т.д.
filp_close – закрыли файл.
Для чтения / записи есть удобные функции kernel_read и kernel_write. Удобство эти функций заключается в явном указании позиции чтения/записи в момент операции. Никакие прыжки с установкой позиции не требуются. Также запись по смещению вне файла вполне логично расширяет файл – тоже не требуется никаких приседаний. Обе функции возвращают количество прочитанных/записанных байт.
Все функции работают с данными из пространства ядра.
Упражнения со структурами:
насколько понял, при объявлении структур в ядре средства #pragma pack не используются. Поэтому структуры объявляются явно со всеми паддингами. По поводу выравнивания полей в интернете есть рассуждения, что “настоятельно рекомендуется” 4-х байтные поля выравнивать на границу 4-х байт, 8-ми байтные – на границу 8 байт.
Для работы с порядком байт в ядре всё предусмотрено: есть типы __le16, __le32 и др. То же самое и для be. И есть функции типа cpu_to_le16, le16_to_cpu – в общем делают очевидные преобразования.