Linux Kernel · 1 min read · Dec 06, 2025
Чтение файлов из пространства ядра Linux (Модуль/Драйвер) (Fedora 14)
Чтение файлов из пространства ядра Linux (Модуль/Драйвер) (Fedora 14)
Кажется, что операции, которые общаются с пространством пользователя, действительно не приветствуются. И я не спорю с этим. Хотя это не означает, что их нельзя выполнить. Драйвер загружает конфигурацию, которая может храниться только на HDD. Когда MS Windows XP загружается, он запоминает, что я выключил Bluetooth, поэтому он не включается, в отличие даже от самой последней версии Linux (Fedora 14 на момент написания) – такая функциональность во многих drivers не была реализована. Когда разработчик использует procfs или символьные устройства, в последовательности загрузки должно быть другое программное обеспечение или скрипт, которое фактически отправляет информацию из файла на конкретное устройство.
После некоторого времени, проведенного в интернете, мне удалось написать такой модуль, который читает файл. И вот он:
#include // Нужен всем модулям
#include // Нужен для KERN_INFO
#include // Нужен для filp
#include // Нужен для дескрипторов сегментов
int init_module(void)
{
// Создаем переменные
struct file *f;
char buf[128];
mm_segment_t fs;
int i;
// Инициализируем буфер нулями
for(i=0;i<128;i++)
buf[i] = 0;
// Чтобы увидеть в /var/log/messages, что модуль работает
printk(KERN_INFO "Мой модуль загружен\n");
// Я использую Fedora и для теста выбрал следующий файл
// Очевидно, он намного меньше 128 байт, но черт с ним =)
f = filp_open("/etc/fedora-release", O_RDONLY, 0);
if(f == NULL)
printk(KERN_ALERT "Ошибка filp_open!!.\n");
else{
// Получаем текущий дескриптор сегмента
fs = get_fs();
// Устанавливаем дескриптор сегмента, связанный с пространством ядра
set_fs(get_ds());
// Читаем файл
f->f_op->read(f, buf, 128, &f->f_pos);
// Восстанавливаем дескриптор сегмента
set_fs(fs);
// Смотрим, что мы прочитали из файла
printk(KERN_INFO "buf:%s\n",buf);
}
filp_close(f,NULL);
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Мой модуль выгружен\n");
} Это все, что нужно для чтения файла /etc/fedora-release. На всякий случай, следующее должно быть в Makefile, если исходный код сохранен как module.c:
obj-m += module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) cleanВыполняя следующее:
$ make
$ su
# insmod module.ko
Затем в конце /var/log/messages я вижу следующее:
Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] Мой модуль загружен
Dec 11 13:06:11 thinkpad kernel: [ 2410.431993] buf:Версия Fedora 14 (Лафлин)
Dec 11 13:06:11 thinkpad kernel: [ 2410.431995]
Дополнительная новая строка может быть просто из файла. Но эй, это именно то, что в этом файле!!!
Похоже, что функции записи также существуют, так что если кто-то захочет записать что-то из пространства ядра в файл – функциональность почти есть.
Get new posts in your inbox
No spam. Unsubscribe anytime.