Каково различие между ioctl (), unlocked_ioctl () и compat_ioctl ()?

htop, версия проклятий вершины, имеет параметр экрана для проявления всех потоков для каждого процесса в структурном виде. Запуск htop и нажатие F5 приведет к:

Screenshot of htop

39
10.12.2010, 13:14
2 ответа

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

Ответ: От нового способа ioctl () Jonathan Corbet:

ioctl() одна из остающихся частей ядра, которое работает под Большой блокировкой ядра (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 зависит от драйвера, таким образом, нет никакого способа сделать независимое от драйвера преобразование.

39
27.01.2020, 19:35
  • 1
    я просматривал последний ioctl источник и видел, что syscall делает несколько проверок и затем переходит здесь. Вы знаете, где я мог собрать больше информации о ioctl системе? Я интересуюсь тем, как команды ioctl на символьных файлах направляются к соответствующему драйверу. Это через unlocked_ioctl то, что это происходит? То, что указатель функции используется на файл (в этом случае a struct file) кажется, что я могу быть близким. unlocked_ioctl зарегистрированный для символьных файлов на инициализации драйвера после mknod? –  sherrellbc 05.01.2017, 11:59
  • 2
    @sherrellbc драйвер устройства регистрирует методы обработки файла такой как unlocked_ioctl в a struct file_ops когда это запускается, и они заполняются от struct file_ops в объект файла, когда файл открыт. mknod не играет роли в этом. –  Gilles 'SO- stop being evil' 05.01.2017, 16:06
  • 3
    я вижу. Я думал, что драйвер устройства должен сначала mknod выставить его интерфейс через устройство посимвольного ввода-вывода прежде, чем перенаправить связанные операции файла к себе (через unlocked_ioctl). –  sherrellbc 05.01.2017, 16:09

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

4
27.01.2020, 19:35

Теги

Похожие вопросы