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]

Дополнительная новая строка может быть просто из файла. Но эй, это именно то, что в этом файле!!!

Похоже, что функции записи также существуют, так что если кто-то захочет записать что-то из пространства ядра в файл – функциональность почти есть.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.