The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

Драйвер “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. Наконец, если регистрация старшего номера или выделение памяти не удаётся, модуль действует соответствующим образом.

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