Метавідповідь : Усі вихідні матеріали, які відбуваються з ядром 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?