В любом случае вам нужно будет написать драйвер ядра, но вы можете выбрать между добавлением нового системного вызова и добавлением ioctl.
Допустим, вы хотите добавить функцию для получения настроек тюнера для устройство захвата видео.
Если вы реализуете его как системный вызов:
- Вы не можете просто загрузить модуль, вам нужно изменить само ядро
- Сотни драйверов, каждый может добавить десятки системных вызовов каждый, нагромождая таблицу тысячами глобальных функций, которые должны храниться вечно.
- Вам нужно будет разместить определение в glib c, и люди должны выполнить обновление, прежде чем они смогут писать для него программы
Если вы реализуете его как ioctl:
- Вы можете собрать свой модуль для существующего ядра и позволить пользователям загружать его без привлечения специалистов по обслуживанию ядра
- Все функции реализовать константы для каждого драйвера в соответствующем файле заголовка, где они могут быть легко добавлены или удалены
- Каждый может начать программировать с ним, просто включив заголовок
Поскольку ioctl очень много проще, гибче и точно предназначено для всех этих c вызовов функций, специфичных для драйвера, это обычно предпочтительный метод.