Meta-answer: Semua hal mentah yang terjadi pada kernel Linux melewati lkml (milis kernel Linux) . Untuk ringkasan yang eksploratif , baca atau cari lwn (berita mingguan Linux) .
Jawaban: Dari Cara baru ioctl () oleh Jonathan Corbet :
ioctl()adalah salah satu bagian tersisa dari kernel yang berjalan di bawah Kunci Kernel Besar (BKL). Di masa lalu, penggunaan BKL memungkinkan ioctl()metode jangka panjang untuk membuat latensi panjang untuk proses yang tidak terkait.
Mengikuti penjelasan tentang tambalan yang diperkenalkan unlocked_ioctldan compat_ioctlke 2.6.11. The penghapusan ioctllapangan terjadi banyak kemudian, di 2.6.36.
Penjelasan: Ketika ioctldieksekusi, dibutuhkan Big Kernel Lock (BKL), jadi tidak ada yang bisa dieksekusi pada saat yang sama. Ini sangat buruk pada mesin multiprosesor, jadi ada upaya besar untuk menyingkirkan BKL. Pertama, unlocked_ioctldiperkenalkan. Ini memungkinkan setiap penulis driver memilih kunci apa yang akan digunakan. Ini bisa sulit, jadi ada periode transisi di mana driver lama masih bekerja (menggunakan ioctl) tetapi driver baru dapat menggunakan antarmuka yang ditingkatkan ( unlocked_ioctl). Akhirnya semua driver dikonversi dan ioctldapat dihapus.
compat_ioctlsebenarnya tidak terkait, meskipun ditambahkan pada saat yang sama. Tujuannya adalah untuk memungkinkan program 32-bit userland untuk melakukan ioctlpanggilan pada kernel 64-bit. Arti argumen terakhir ioctlbergantung pada driver, sehingga tidak ada cara untuk melakukan konversi driver-independen.
unlocked_ioctlini terjadi? Fakta bahwa pointer fungsi digunakan per file (dalam hal ini astruct file) sepertinya saya mungkin dekat. Apakahunlocked_ioctlfile karakter yang terdaftar untuk inisialisasi driver setelahmknod?