Яка різниця між 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()є однією з решти частин ядра, яка працює під великим замком ядра (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
Я переглянув останнє джерело йоктлу і побачив, що syscall робить кілька перевірок, а потім стрибає сюди . Чи знаєте ви, де я міг би зібрати більше інформації про систему йоктлів? Мене цікавить, як команди ioctl для файлів символів перенаправляються до відповідного драйвера. Чи через unlocked_ioctlце це відбувається? Те, що вказівник функції використовується на файл (в даному випадку a 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) методу структура файлових операцій ioctl () на compat_ioctl () в ядрі 2.6.36 не працює (наприклад, для деяких драйверів пристроїв) та повинна бути використана unlocked_ioctl ().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.