İoctl (), unlocked_ioctl () ve compat_ioctl () arasındaki fark nedir?


37

Linux 2.6.36 kaynak kodundan geçerek lxr.linux.no adresinde bulamadığım ioctl()yöntemi bulamadım file_operations. Bunun yerine iki yeni arama buldum: unlocked_ioctl()ve compat_ioctl(). Arasındaki fark nedir ioctl(), unlocked_ioctl()ve compat_ioctl()?

Yanıtlar:


39

Meta-cevap: Linux çekirdeğinde meydana gelen tüm ham maddeler lkml'den (Linux çekirdek posta listesi) geçiyor . Açıklayıcı özetler için, lwn'u okuyun veya arayın (Linux haftalık haberler) .

Cevap: Gönderen ioctl () yeni yol ile Jonathan Corbet :

ioctl()Büyük Çekirdek Kilidi (BKL) altında çalışan, çekirdeğin kalan kısımlarından biridir. Geçmişte, BKL kullanımı uzun süren ioctl()yöntemlerin ilgisiz süreçler için uzun gecikmeler yaratmasını mümkün kılmıştır .

2.6.11'e giren unlocked_ioctlve compat_ioctleklenen yamanın açıklamalarını takip eder . Çıkarılması ioctlalanında 2.6.36 yılında, çok sonradan oldu.

Açıklama: Yürütüldüğünde ioctl, Büyük Çekirdek Kilidi'ni (BKL) aldı, böylece aynı anda başka hiçbir şey yürütülemedi. Bu çok işlemcili bir makinede çok kötü, bu yüzden BKL'den kurtulmak için büyük bir çaba vardı. İlk unlocked_ioctlolarak tanıtıldı. Her sürücü yazarının bunun yerine hangi kilidi kullanacağını seçmesini sağlar. Bu zor olabilir, bu nedenle eski sürücülerin hala çalıştığı (kullanan ioctl) ancak yeni sürücülerin geliştirilmiş arayüzü ( unlocked_ioctl) kullanabileceği bir geçiş dönemi vardı . Sonunda tüm sürücüler dönüştürüldü ve ioctlkaldırıldı.

compat_ioctlaslında aynı anda eklenmesine rağmen ilgisizdir. Amacı 32 bitlik kullanıcı programı programlarının ioctl64 bitlik bir çekirdeğe çağrı yapmasını sağlamaktır . Son argümanın anlamı ioctlsürücüye bağlıdır, bu yüzden sürücüden bağımsız bir dönüşüm yapmanın bir yolu yoktur.


1
En son ioctl kaynağına bakıyordum ve sistem çağrısının birkaç kontrol yaptığını ve sonra buraya atladığını gördüm . İoctl sistemi hakkında nereden daha fazla bilgi toplayabileceğimi biliyor musunuz? Karakter dosyalarındaki ioctl komutlarının uygun sürücüye nasıl yönlendirildiği ile ilgileniyorum. unlocked_ioctlBu olur mu bitti mi? Dosya başına bir işlev göstergesinin kullanılması (bu durumda a struct file) yakın gibi görünüyorum. unlocked_ioctlSürücü başlatma sırasındaki karakter dosyaları için kayıtlı mı mknod?
sherrellbc

1
@sherrellbc alet sürücüsü gibi yöntemler ele dosya kaydeder unlocked_ioctla struct file_opsbaşlatıldığında, ve dolduruldukları struct file_opsdosya açıldığında dosya nesnesine. mknodbunda hiçbir rol oynamaz.
Gilles 'SO- kötü olmayı'

Anlıyorum. mknodİlişkili dosya işlemlerini kendisine (yönlendirme) yönlendirmeden önce bir aygıt sürücüsünün önce arayüzünü bir karakter aygıtı üzerinden göstermesi gerektiğini düşünüyordum unlocked_ioctl.
sherrellbc

4

Çekirdek 2.6.36'daki (include / linux / fs.h) struct file_operations method ioctl () 'nin çekirdeğin 2.6.36 yerine (örneğin bazı aygıt sürücülerinde) ve unlocked_ioctl () işlevinin kullanılması gerektiği durumlar vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.