Perbedaan penggunaan antara file perangkat, ioctl, sysfs, netlink

12

Saya mencoba menjelaskan mana yang paling berguna (dalam hal fungsi) metode berinteraksi dengan perangkat di Linux. Seperti yang saya pahami, file perangkat hanya memperlihatkan sebagian fungsi (blok alamat di perangkat blok, stream di perangkat karakter, dll ...). ioctl(2)tampaknya paling umum digunakan, namun beberapa orang mengatakan itu tidak aman, dan sebagainya.

Beberapa artikel bagus atau petunjuk relevan lainnya akan diterima.

Constantine
sumber

Jawaban:

9

ioctlcenderung berjalan seiring dengan sebuah /deventri; kode khas Anda akan lakukan

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

Ini adalah perilaku Unix standar sempurna. Di dalam driver kernel Anda dapat menempatkan kontrol akses (misalnya hanya rootdapat melakukan beberapa hal, atau memerlukan kemampuan khusus untuk akses berbutir lebih halus) yang membuatnya cukup fleksibel dan kuat.

Tentu saja ini berarti bahwa perangkat dapat mengekspos lebih banyak daripada menggunakan aktivitas baca-tulis blok / karakter; banyak hal dapat dilakukan melalui ioctlpanggilan. Tidak begitu mudah digunakan dari skrip shell, tapi cukup mudah dari Catau perlatau pythonatau serupa.

sysfsentri adalah cara lain untuk berinteraksi dengan driver. Biasanya setiap jenis perintah akan memiliki entri yang berbeda, sehingga dapat menjadi rumit untuk menulis driver tetapi membuatnya sangat mudah diakses melalui userspace; skrip shell sederhana dapat memanipulasi banyak hal, tetapi mungkin tidak terlalu efisien

netlinkterutama difokuskan (saya pikir!) pada transfer data jaringan, tetapi dapat digunakan untuk hal-hal lain. Ini benar-benar bagus untuk volume transfer data yang lebih besar dan dimaksudkan sebagai penerus ioctldalam beberapa kasus.

Semua opsi baik; case use Anda mungkin lebih baik menentukan jenis antarmuka yang akan diekspos dari driver Anda.

Stephen Harris
sumber
1
Menambahkan lebih banyak untuk membingungkan: "ioctl: Namun, ioctl sudah usang dalam kernel, dan Anda akan merasa sulit untuk mendapatkan driver dengan penggunaan baru ioctl yang diterima di hulu. Pengelola kernel tidak menyukai ioctl karena itu membuat kode kernel dan kode aplikasi terlalu saling tergantung , dan sulit untuk mempertahankan keduanya di seluruh versi kernel dan arsitektur. " [Halaman 255] "Menguasai Pemrograman Linux Tertanam" oleh Chris Simmonds [2017].
Israr
Ini menambahkan pertanyaan: Lalu bisakah kita mengakses sysfs dari C?
Israr