2015-03-31 4 views
1

Я новичок в разработке драйвера Linux.Как использовать модель устройства Linux и/sys?

Традиционно, если я хочу, чтобы создать символьное устройство, мне просто нужно реализовать readwrite и ioctl функции, и зарегистрировать его register_chrdev_region с соответствующими Major device ID. Затем используйте mknod, чтобы создать файл устройства с этим номером Major device ID. Затем вызовите readwriteopen в пространстве пользователя, после чего вызовите соответствующие функции по ядру.

Но сейчас я изучаю Linux device model и sys filesystem, который добавлен в ядро ​​2.6. Мне сказали, что, если это возможно, не используйте /dev filesystem, так как Linux теперь имеет хорошую модель для обработки устройства и driver.This спутать меня, так что я буду суммировать мое замешательство в некоторые вопросы:

  1. Как Я создаю устройство char в/sys? Чтобы быть более конкретным, как мне создать нулевое устройство, как /dev/null?
  2. Как мне вызвать функцию драйвера устройства char из пользовательского пространства?
  3. Я слышал, что udev основан на sys filesystem, чтобы создать файл устройства в /dev. Зачем? Так как мне сказали: «Если возможно, не используйте /dev filesystem», почему udev использовать /sys для создания файла в /dev?
  4. Есть ли в файле sys какие-либо идеи, такие как char device file или block device?
  5. В /dev, openwrite из пользовательского пространства, наконец, сопоставить функции в file operation structure определенных мною, то какие функции будут вызываться при открытии или записывать файлы в /ssy?

ответ

4

Без контекста Ваш утверждение о /dev непонятно. Во всяком случае:

  1. Вы не можете создавать устройства char в sysfs. Основная цель sysfs - экспортировать информацию и разрешить пользователю настраивать отдельные значения (для некоторых примеров просто перейдите к /sys/). Устройства Char обычно делают очень сложные вещи.

  2. Если вы имеете в виду, как вы вызываете свои драйверы, читаете, пишите, ioctl, ... ну, открыв (2), прочитайте (2), напишите (2), ioctl (2) (смотрите man-страницы этих команд)

  3. Когда появляется устройство, ядро ​​создает каталог под/sys. Например, посмотрите на ls /sys/bus/usb/devices/. Все эти каталоги создаются при появлении USB-устройства. Вы можете попробовать подключить/отключить USB-устройства. udev обратите внимание на sysfs для обнаружения новых устройств, и в соответствии с информацией из sysfs он создает устройство под /dev. Это происходит, когда водитель каким-то образом вызывает device_add(). Часто эти функции вызывают другие функции регистра, такие как: device_create, device_register или другие из других подсистем.

  4. Идея sysfs заключается в предоставлении информации о загруженных устройствах и драйверах. Таким образом, вы можете изменить параметры устройства, шины и драйвера. Или вручную подключите устройство к модулю

  5. На самом деле, за атрибутами sysfs существует набор файлов file_operation, где управление открыто, чтение и запись управляется ядром, а не вашим драйвером. Чтобы создать атрибут sysfs, вы должны предоставить пару функций show и магазин, чтобы прочитать/записать что-нибудь из драйвера. Затем ядро ​​направит запросы к вашему правильному атрибуту

+0

Третий пункт, который вы упомянули, касается меня. Что значит «когда устройство появляется»? После того, как я назову 'register_chrdev_region'' cdev_init' и 'cdev_add', я могу получить информацию из' cat/proc/devices', но кажется, что ничего не происходит в '/ sys'. Я не могу найти какую-либо информацию своего устройства в '/ sys/dev/char' – demonguy

+0

Я улучшил свой ответ в точке 3. в любом случае, когда вы выполняете' device_create() ', и если вы этого не делаете, сделайте это :) После случайного примера из Интернета http://www.opensourceforu.com/2011/04/character-device-files-creation-operations/ – Federico

+0

Спасибо, Это именно то, что я хочу! – demonguy

0

Свободно доступная книга Linux Device Drivers объясняет это очень подробно.

+0

Я читаю эту книгу! – demonguy

+0

@demonguy Продолжайте читать! –

+0

Но я не могу понять. В/dev все вызовы из пользовательского пространства, наконец, вызовут функции в структуре file_operation. Но в/sys, похоже, есть тысячи видов отображения из пространства пользователя в пространство ядра. Я не понимаю, как автор ее разрабатывает. На самом деле я не хочу просто помнить об этих вещах, я просто хочу знать, почему – demonguy

 Смежные вопросы

  • Нет связанных вопросов^_^