Все разработчики ядра говорят, что файловый ввод / вывод из пространства ядра плох (особенно если вы обращаетесь к этим файлам по их путям), но основное ядро делает это при загрузке прошивки. Если вам просто нужно читать из файлов, используйте
kernel_read_file_from_path(const char *path, void **buf, loff_t *size, loff_t max_size, enum kernel_read_file_id id)
Функция
, используемая кодом загрузчика прошивки, объявлена в include/linux/fs.h
. Эта функция возвращает отрицательное значение при ошибке.
Я не совсем уверен относительно точки переменной id
в конце, если вы посмотрите на код, который на самом деле не используется, просто поместите что-то вроде READING_FIRMWARE
(без кавычек).
buf
не заканчивается нулем, вместо этого обратитесь к его размеру в size
. Если вам нужно, чтобы он завершался нулем, создайте строку длиной size + 1
байт и скопируйте ее или переписайте функцию kernel_read_file()
(используется kernel_read_file_from_path()
, определенную в fs/exec.c
) и добавьте ее в i_size
, где память выделено. (Если вы хотите сделать это, вы можете переопределить функцию kernel_read_file()
в вашем модуле с другим именем функции, чтобы избежать изменения всего ядра.)
Если вам нужно записать в файлы, есть функция kernel_write()
(аналог kernel_read()
, которая используется kernel_read_file()
и, следовательно, также kernel_read_file_from_path()
), но нет kernel_write_file()
или * Функция 1026 *. Вы можете посмотреть код в файле fs/exec.c
в дереве исходных текстов ядра Linux, где kernel_read_file()
и kernel_read_file_from_path()
определены для написания ваших собственных функций kernel_write_file()
и kernel_write_file_from_path()
, которые вы можете включить в свой модуль.
И, как всегда, с помощью этой функции вы можете сохранить содержимое файла в указателе символа вместо пустого указателя при помощи его приведения.