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