Драйвер “memory”: связь устройства с его файлами

Предыдущая  Содержание  Следующая V*D*V

В UNIX и Linux устройства доступны из пользовательского пространства в точности так же, как доступны файлы. Такие файлы устройств, как правило, подкаталоги каталога /dev.

 

Чтобы связать обычный файл с модулем ядра, используются два числа: старший номер и младший номер. Старший номер является тем, что используется ядром, чтобы связать файл с его драйвером. Младший номер используется внутри устройства и для простоты он не будет рассмотрен в этой статье.

 

Чтобы получить это, вводом следующей команды от имени суперипользователя должен быть создан файл (который будет использоваться для доступа к драйверу устройства):

 

# mknod /dev/memory c 60 0

 

В приведённой выше строчке c означает, что должно быть создано символьное устройство, 60 является старшим номером и 0 является младшим номером.

 

Внутри драйвере, чтобы связать его в пространстве ядра с соответствующим файлом в /dev, используется функция register_chrdev. Она вызывается с тремя аргументами: старший номер, строка символов, показывающая имя модуля и  структура file_operations, которая связывает вызов с заданными файловыми функциями. Она вызывается при установке модуля таким образом:

 

<memory init module> =

 

int memory_init(void) {

    int result;

 

    /* Registering device */

    result = register_chrdev(memory_major, "memory", &memory_fops);

    if (result < 0) {

        printk(

            "<1>memory: cannot obtain major number %d\n", memory_major);

        return result;

    }

 

    /* Allocating memory for the buffer */

    memory_buffer = kmalloc(1, GFP_KERNEL);

    if (!memory_buffer) {

        result = -ENOMEM;

        goto fail;

    }

    memset(memory_buffer, 0, 1);

 

    printk("<1>Inserting memory module\n");

    return 0;

fail:

    memory_exit();

    return result;

}

 

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

Предыдущая  Содержание  Следующая