2017-02-18 2 views

ответ

1

Прежде всего, вам нужен файл заголовка linux/fs.h, где объявляются функции для файловой системы. Это необходимо, потому что драйвер символов управляет доступом к символьному устройству, которое обычно представляется в виде файла в /dev.

Если запустить ls -l в /dev вы видите несколько линий, как это:

crw-rw----. 1 root lp   6, 0 14. Feb 18:23 lp0 
crw-rw----. 1 root lp   6, 1 14. Feb 18:23 lp1 
crw-rw----. 1 root lp   6, 2 14. Feb 18:23 lp2 
crw-rw----. 1 root lp   6, 3 14. Feb 18:23 lp3 
crw-rw-rw-. 1 root tty   5, 0 15. Feb 10:57 tty 
crw--w----. 1 root tty   4, 0 14. Feb 18:23 tty0 

c в начале строки указывает файлы устройств символов. Это узлы файловой системы, с которыми вы можете связаться с устройством через драйвер. Два числа до даты указывают, какой драйвер используется для этого устройства. Например, lp0 имеет номера 6 и 0. Первое число называется основным и вторым второстепенным. Основное число используется ядром для выбора правильного драйвера для этого устройства. В /proc/devices вы найдете имена модулей ядра, фактического драйвера, для этих чисел. Второй номер используется только драйвером, так что можно управлять более чем одним устройством с одним драйвером. Например, lp0-3 выше использовать весь драйвер с основным номером 6.

Старый и простой способ зарегистрировать ваш драйвер и создать запись в /dev/devices, чтобы вызвать следующую функцию.

int register_chrdev(unsigned int major, const char *name, 
         const struct file_operations *fops) 

major является основной номер вашего драйвера, name это имя, которое будет отображаться в /dev/devices и fops указатель на таблицу переходов со всеми функциями вашего драйвера. Это реализуется со структурой file_operations. Вы должны найти эту структуру в fe.h вашего ядра, чтобы знать поддерживаемые функции. Затем вы определяете эту структуру в своем драйвере и вводите имена функций вашего драйвера и NULL для функций, которые ваш драйвер не поддерживает. Для записей NULL используются некоторые значения по умолчанию. Более удобно использовать C tagged structure initialization syntax. Наиболее важными функциями являются lseek, read и write. Там устройство представлено структурой file, также определенной в linux/fs.h.

В новом коде используется структура cdev в linux/cdev.h вместо вышеуказанной функции. Для этого и более подробная информация о программировании драйверов Я рекомендую: http://www.oreilly.com/openbook/linuxdrive3/book/ch03.pdf.

Если у вас есть скомпилированный драйвер, вы можете загрузить его с insmod в ядро. Если вы хотите использовать modprobe, вы можете посмотреть, как он настроен в вашей системе, потому что он отличается. Для получения узла в /dev для устройства используется mknod. Для символьного устройства с основным номером 10 и второстепенным номером 0 это выглядит так:

mknod /dev/my_device c 10 0