ioctl против модулей ядра в Linux - PullRequest
0 голосов
/ 10 июля 2020

Я знаю, что модули ядра используются для записи device drivers. Вы можете добавить новый system calls в ядро ​​Linux и использовать его для связи с другими устройствами.

Я также читал, что ioctl - это системный вызов, используемый в linux для реализации системных вызовов, которые по умолчанию недоступно в ядре.

Мой вопрос: почему бы вам просто не написать новый kernel module для вашего устройства вместо использования ioctl? зачем использовать ioctl b при наличии модулей ядра?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

В любом случае вам нужно будет написать драйвер ядра, но вы можете выбрать между добавлением нового системного вызова и добавлением ioctl.

Допустим, вы хотите добавить функцию для получения настроек тюнера для устройство захвата видео.

Если вы реализуете его как системный вызов:

  • Вы не можете просто загрузить модуль, вам нужно изменить само ядро ​​
  • Сотни драйверов, каждый может добавить десятки системных вызовов каждый, нагромождая таблицу тысячами глобальных функций, которые должны храниться вечно.
  • Вам нужно будет разместить определение в glib c, и люди должны выполнить обновление, прежде чем они смогут писать для него программы

Если вы реализуете его как ioctl:

  • Вы можете собрать свой модуль для существующего ядра и позволить пользователям загружать его без привлечения специалистов по обслуживанию ядра
  • Все функции реализовать константы для каждого драйвера в соответствующем файле заголовка, где они могут быть легко добавлены или удалены
  • Каждый может начать программировать с ним, просто включив заголовок

Поскольку ioctl очень много проще, гибче и точно предназначено для всех этих c вызовов функций, специфичных для драйвера, это обычно предпочтительный метод.

0 голосов
/ 10 июля 2020

Я также читал, что ioctl - это системный вызов, используемый в linux для реализации системных вызовов, которые по умолчанию недоступны в ядре.

Это неверно.

Системные вызовы (для Linux) перечислены в syscalls (2) (их сотни между пользовательским пространством и областью ядра) и ioctl (2) - это один из них. Прочтите также wikipage на ioctl и на Unix Философию и Linux Ассемблер HowTo

На практике чаще всего используется ioctl в файлах устройства и используется для вещей, которые не являются read (2) или write (2) байтов. Например, звук создается путем записи байтов в /dev/audio, но для изменения громкости вы используете ioctl. См. Также fcntl (2) , играющий аналогичную роль.

Ввод / вывод также может происходить (каким-то косвенным образом ...) через mmap (2) и связанные виртуальные системные вызовы адресного пространства.

Подробнее см. Расширенный Linux Программирование и Операционные системы: три простых элемента . Посмотрите Osdev , чтобы узнать больше о кодировании вашей собственной ОС.

Модуль ядра может реализовывать новые устройства или новые ioctl, и c ... См. kernelnewbies подробнее. Я склонен полагать, что это может иногда добавить несколько новых системных вызовов (но это было неверно в старых linux ядрах , например в 3.x)

Linux в основном с открытым исходным кодом . Пожалуйста, скачайте и посмотрите исходный код. См. Также Linux С нуля .

IIR C, Linux ядро ​​1.0 не имело никаких модулей ядра. Но это было примерно в 1995 году.

...