Apa perbedaan antara ioctl (), unlocked_ioctl () dan compat_ioctl ()?

38

Akan melalui source code linux 2.6.36 di lxr.linux.no , saya tidak dapat menemukan ioctl()metode di file_operations. Sebaliknya saya menemukan dua panggilan baru: unlocked_ioctl()dan compat_ioctl(). Apa perbedaan antara ioctl(), unlocked_ioctl()dan compat_ioctl()?

Sen
sumber

Jawaban:

39

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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Saya mencari sumber ioctl terbaru dan melihat bahwa syscall melakukan beberapa pemeriksaan dan kemudian melompat ke sini . Apakah Anda tahu di mana saya dapat mengumpulkan lebih banyak informasi tentang sistem ioctl? Saya tertarik pada bagaimana perintah ioctl pada file karakter dialihkan ke driver yang sesuai. Apakah unlocked_ioctlini terjadi? Fakta bahwa pointer fungsi digunakan per file (dalam hal ini a struct file) sepertinya saya mungkin dekat. Apakah unlocked_ioctlfile karakter yang terdaftar untuk inisialisasi driver setelah mknod?
sherrellbc
1
@sherrellbc Driver perangkat register file penanganan metode seperti unlocked_ioctldalam struct file_opsketika mulai, dan mereka akan diisi dari struct file_opsdalam file objek ketika file dibuka. mknodtidak memainkan peran dalam hal ini.
Gilles 'SO- berhenti bersikap jahat'
Saya melihat. Saya berpikir driver perangkat pertama-tama harus mknodmengekspos antarmuka melalui perangkat karakter sebelum mengarahkan operasi file yang terkait ke dirinya sendiri (via unlocked_ioctl).
sherrellbc
4

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