В чем разница между драйверами misc и драйверами char?
Я читаю о разных драйверах в Linux, и я немного смущен различиями между ними и драйверами char. Один источник, журнал Linux, пишет:
Алессандро рассказывает нам, как регистрировать небольшое устройство, нуждающееся в одном точка входа с драйвером misc.
Иногда людям нужно писать "небольшие" драйверы устройств для поддержки пользовательских хаков - либо аппаратных, либо программных. С этой целью, а также для размещения некоторых реальных драйверов Ядро Linux экспортирует интерфейс, позволяющий модулю регистрировать свои собственные небольшие драйверы. Драйвер misc был разработан для этой цели.
Итак, из этого я понял, что есть простой драйвер (в данном случае с одной точкой входа), который является драйвером misc. Затем в другом источнике, Essential Linux Device Drivers, говорится:
Различные (или разные) драйверы - это простые драйверы char, которые разделяют некоторые общие характеристики. Поскольку разные драйверы являются char драйверами, более раннее обсуждение пунктов назначения драйверов char для разговора драйверов.
Теперь это говорит о том, что драйверы char, но, возможно, подмножество функций, а драйверы char могут иметь более одной точки входа (например, ioctl()
или open()
или read()
)
Итак, что, в терминах кодирования Linux C, есть различия между драйверами char и misc? (Помимо очевидного значительного присвоения номера (10) для всех драйверов misc). Есть ли разница в поддерживаемых точках входа? Является ли мое предположение правильным, что у разных драйверов устройств есть только подмножество того, что вы можете получить в полном драйвере устройства char?
Ответы
Ответ 1
Изменить. Я думал, что вы говорите о драйверах drivers/misc
, но я вижу, что вы ссылаетесь на драйверы символов, используя misc_register
(и весь API в drivers/char/misc.c
). Вы должны указать это в своем вопросе.
В этом случае API misc
, кажется, упрощает вашу жизнь, когда вы пишете небольшой драйвер символов и не хотите выделять новый основной номер только для использования одного младшего номера, например. Это упрощает, но все операции с файлами по-прежнему доступны с помощью члена fops
struct miscdevice
. Основное различие заключается в том, что вы получаете только одно небольшое количество на устройство misc
.
Мой предыдущий, несвязанный ответ был для записи:
Быстро посмотрите drivers/misc
: вы не найдете никакого "misc
core" там. Это означает: misc
не является классом устройства; это всего лишь куча драйверов, которые не подходят ни в какой другой категории. Такие вещи, как барометры, ЦАПы, тестовые комплекты и другие странные вещи.
Посмотрите наверху drivers/misc/Kconfig
:
#
# Misc strange devices
#
menu "Misc devices"
Все элементы в этом Kconfig не зависят от какого-либо "ядра misc
", а от других ядер (i2c
, pci
, tty
и т.д.). Обычно, когда драйвер действительно использует ядро драйвера, вы увидите его в своем Kconfig. Например, почти все драйверы leds
(drivers/leds
) зависят от ядра класса leds
и имеют это в Kconfig node:
depends on LEDS_CLASS
Может быть, misc
драйверы - все драйверы символов (я не проверял их все), но там что-то еще будет работать, хотя это, вероятно, будет не в том месте. Я считаю, что многие драйверы misc
можно перенести в лучшие места сейчас... ветеран-хакер может подтвердить это.
Итак, чтобы ответить на ваш вопрос: misc
драйверы не обязательно должны быть драйверами символов, поэтому две категории полностью не связаны. Драйвер misc
не несет ничего, кроме драйвера персонажа, потому что драйвер misc
, опять же, ничего особенного.
Обновить: отличный Honeywell compass driver. Он небольшой и простой.
Он взаимодействует с фактическим компасом с использованием I²C. Это устройство не будет отображаться как персональное устройство, поэтому забудьте о главном номере 10. Однако он появится где-то в Sysfs под /sys/bus/i2c/devices
, как это делают все устройства I²C. И вы увидите атрибуты Sysfs, которые он добавляет к своей группе, например heading0_input
, который будет показывать текущее направление компаса при чтении.
Итак, у вас есть это: a misc
драйвер, который не является символьным драйвером.
Ответ 2
Теперь это говорит о том, что драйверы misc - это всего лишь драйверы char, но, возможно, подмножество функций, а драйверы char могут иметь более одной точки входа (например, ioctl() или open() или вызов read())
Да, это просто драйвер Charater и драйвер Misc также имеют несколько точек ввода read(), write(), ioctl() (потому что в структуре miscdevice уже есть структура filefile_operations)
в моем понимании, когда нам нужно написать небольшой драйвер (есть только одна точка входа или еще несколько (2,3,... точки входа) < < средний средний драйвер), мы должны использовать драйвер misc, это предотвратит утечку ОЗУ, если мы зарегистрируем новый основной номер.
Теперь, когда ядро хранит статическую таблицу драйверов устройств, легкомысленное распределение основных номеров довольно бесполезно для ОЗУ. Поэтому ядро Linux предлагает упрощенный интерфейс для простых драйверов - те, которые будут регистрировать одну точку входа. Обратите внимание, что в целом выделение всего пространства имен основного номера на каждое устройство выгодно. Это позволяет обрабатывать несколько терминалов, несколько последовательных портов и несколько разделов диска без каких-либо накладных расходов в ядре: один драйвер заботится обо всех них и использует незначительное число для дифференциации.