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