Может ли кто-нибудь объяснить интерфейсы, связанные с драйвером linux char и соответствующими ему компонентами?Интерфейсы в драйвере символов linux
ответ
Прежде всего, вам нужен файл заголовка 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