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_ioctl
dan compat_ioctl
ke 2.6.11. The penghapusan ioctl
lapangan terjadi banyak kemudian, di 2.6.36.
Penjelasan: Ketika ioctl
dieksekusi, 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_ioctl
diperkenalkan. 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 ioctl
dapat dihapus.
compat_ioctl
sebenarnya tidak terkait, meskipun ditambahkan pada saat yang sama. Tujuannya adalah untuk memungkinkan program 32-bit userland untuk melakukan ioctl
panggilan pada kernel 64-bit. Arti argumen terakhir ioctl
bergantung pada driver, sehingga tidak ada cara untuk melakukan konversi driver-independen.
unlocked_ioctl
ini terjadi? Fakta bahwa pointer fungsi digunakan per file (dalam hal ini astruct file
) sepertinya saya mungkin dekat. Apakahunlocked_ioctl
file karakter yang terdaftar untuk inisialisasi driver setelahmknod
?unlocked_ioctl
dalamstruct file_ops
ketika mulai, dan mereka akan diisi daristruct file_ops
dalam file objek ketika file dibuka.mknod
tidak memainkan peran dalam hal ini.mknod
mengekspos antarmuka melalui perangkat karakter sebelum mengarahkan operasi file yang terkait ke dirinya sendiri (viaunlocked_ioctl
).Ada beberapa kasus ketika penggantian (termasuk / linux / fs.h) struct file_operations metode ioctl () ke compat_ioctl () di kernel 2.6.36 tidak berfungsi (misalnya untuk beberapa driver perangkat) dan unlocked_ioctl () harus digunakan.
sumber