Мета-ответ: Все сырые вещи, происходящие с ядром 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
?