В чем разница между ioctl (), unlocked_ioctl () и compat_ioctl ()?

38

Просматривая исходный код linux 2.6.36 по адресу lxr.linux.no , я не смог найти ioctl()метод в file_operations. Вместо этого я нашел два новых звонка: unlocked_ioctl()и compat_ioctl(). В чем разница между ioctl(), unlocked_ioctl()и compat_ioctl()?

сен
источник

Ответы:

39

Мета-ответ: Все сырые вещи, происходящие с ядром Linux, проходят через lkml (список рассылки ядра Linux) . Пояснительные сводки читайте или ищите lwn (еженедельные новости Linux) .

Ответ: От нового образа IOCTL () по Джонатан Корбет :

ioctl()является одной из оставшихся частей ядра, которая работает под Big Kernel Lock (BKL). В прошлом использование BKL позволяло долговременным ioctl()методам создавать длительные задержки для несвязанных процессов.

Следует объяснение патча , который ввел unlocked_ioctlи compat_ioctlв 2.6.11. Удаление ioctlполя произошло много позже, в 2.6.36.

Объяснение: Когда это ioctlбыло выполнено, потребовалась блокировка большого ядра (BKL), поэтому больше ничего не могло выполняться одновременно. Это очень плохо на многопроцессорной машине, поэтому было приложено много усилий, чтобы избавиться от BKL. Сначала unlocked_ioctlбыл представлен. Это позволяет каждому автору драйвера выбирать, какую блокировку использовать вместо этого. Это может быть сложно, поэтому был переходный период, в течение которого старые драйверы все еще работали (использовали ioctl), но новые драйверы могли использовать улучшенный интерфейс ( unlocked_ioctl). В конце концов все драйверы были преобразованы и ioctlмогут быть удалены.

compat_ioctlна самом деле не связано, хотя он был добавлен в то же время. Его цель - позволить 32-битным пользовательским программам совершать ioctlвызовы на 64-битном ядре. Значение последнего аргумента ioctlзависит от драйвера, поэтому нет способа выполнить независимое от драйвера преобразование.

Жиль "ТАК - прекрати быть злым"
источник
1
Я просматривал последний источник ioctl и увидел, что системный вызов делает несколько проверок, а затем переходит сюда . Вы знаете, где я мог бы собрать больше информации о системе ioctl? Меня интересует, как команды ioctl для символьных файлов направляются на соответствующий драйвер. Это происходит через unlocked_ioctlэто? Тот факт, что указатель функции используется для файла (в данном случае а struct file), кажется, я могу быть близок. Является ли unlocked_ioctlзарегистрированный для файлов символов при инициализации драйвера после mknod?
sherrellbc
1
@sherrellbc Драйвер устройства регистрирует методы , такие как обработка файла unlocked_ioctlв struct file_opsпри запуске, и они заполняются из struct file_opsв объект файла при открытии файла. mknodне играет никакой роли в этом.
Жиль "ТАК - перестань быть злым"
Понимаю. Я думал, что драйвер устройства должен сначала mknodвыставить свой интерфейс через символьное устройство, прежде чем перенаправлять связанные файловые операции к себе (через unlocked_ioctl).
sherrellbc
4

Есть случаи, когда замена (include / linux / fs.h) метода struct file_operations ioctl () на compat_ioctl () в ядре 2.6.36 не работает (например, для некоторых драйверов устройств) и unlocked_ioctl () необходимо использовать.


источник