Метавідповідь : Усі вихідні матеріали, які відбуваються з ядром 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
залежить від драйвера, тому немає можливості здійснити незалежне від водія перетворення.
unlocked_ioctl
це це відбувається? Те, що вказівник функції використовується на файл (в даному випадку astruct file
), здається, я може бути близьким. Чиunlocked_ioctl
зареєстровано файли символів після ініціалізації драйвера післяmknod
?