Как / sys / dev / char заполняется в Linux? - PullRequest
0 голосов
/ 14 ноября 2018

Я учусь писать простой модуль ядра, который реализует системные вызовы open, read, write, close, ioctl для чтения / записи в памяти ядра (что-то вроде демонстрации совместно используемой памяти / IPC).

Раньше я звонил mknodдля привязки старшего / младшего номера, выделенного драйвером, к символьному файлу.Но я задался вопросом о том, почему мы не всегда обязаны делать это вручную, когда мы подключаем USB-устройство к системе, и я обнаружил udev.

Я знаю, как использовать kobject_init_and_add() и kobject_uevent() создать узел в дереве sysfs и уведомить udev, но во время исследования папки /sys я заметил папку /sys/dev/char, которая содержит символические ссылки на устройства, названные как major:minor.Я не понимаю, почему я не могу найти здесь главную / второстепенную пару моего драйвера ... Должен ли я вручную делать что-то еще внутри модуля?

Как найти полный, но простой пример того, как правильно описать и обработать мое «виртуальное» устройство в дереве sysfs?

1 Ответ

0 голосов
/ 15 ноября 2018

Прочитав главу 4 « Разработка драйвера устройства Linux » John Madieu , я обнаружил, что это проще, чем я думал:

все, что вам нужночтобы автоматически создать соответствующие абстракции символьного устройства в /sys и /dev, нужно создать struct class с помощью функции class_create(...), а затем использовать device_create(...).

Эффекты: предполагаяу вас есть класс с именем my_class и вы вызываете устройство my_device с основным номером xx и младшим номером yy,

  • /sys/class/my_class папка создана;
  • /sys/devices/virtual/my_class/my_device папка создана;
  • /sys/class/my_class/my_device символьная ссылка указывает на /sys/class/my_class/my_device;
  • /sys/dev/char/xx:yy символическая ссылка указывает на /sys/class/my_class/my_device;
  • /dev/my_device символьное устройствосоздается (поэтому больше не нужно mknod вызовов);

Папка /sys/class/my_class/my_device довольно интересна.Он содержит:

  • dev файл: он содержит major:minor число;
  • uevent файл: если вы напишите в нем add, ядро ​​будет переизданоadd событий;события используются для оповещения демона пользовательского пространства, такого как udev, о создании / изменении / удалении объекта ядра в дереве sysfs;
  • subsystem символическая ссылка: указывает на папку /sys/class/my_class;
  • power: возможно, некоторые интерфейсы для таких вещей, как this .

Всегда не забывайте сопоставлять каждый вызов * _create с вызовом * destroy в функции выхода модуля.

class_create, class_destroy, device_createdevice_destroy объявлены в include/linux/device.h и определены соответственно в drivers/base/class.c и drivers/base/core.c (пути в исходном дереве ядра).В этих исходных файлах есть хорошая документация.

...