Мета-ответ: Все сырые вещи, происходящие с ядром 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зависит от драйвера, поэтому нет способа выполнить независимое от драйвера преобразование.
unlocked_ioctlэто? Тот факт, что указатель функции используется для файла (в данном случае аstruct file), кажется, я могу быть близок. Является лиunlocked_ioctlзарегистрированный для файлов символов при инициализации драйвера послеmknod?