Was ist der Unterschied zwischen ioctl (), unlocked_ioctl () und compat_ioctl ()?

37

Ich habe den Linux 2.6.36-Quellcode unter lxr.linux.no durchgesehen und konnte die ioctl()Methode in nicht finden file_operations. Stattdessen habe ich zwei neue Anrufe gefunden: unlocked_ioctl()und compat_ioctl(). Was ist der Unterschied zwischen ioctl(), unlocked_ioctl()und compat_ioctl()?

Sen
quelle

Antworten:

39

Meta-Antwort: Alle Rohdaten, die mit dem Linux-Kernel passieren, durchlaufen lkml (die Linux-Kernel-Mailingliste) . Lesen oder durchsuchen Sie lwn (wöchentliche Linux-Nachrichten) , um erklärende Zusammenfassungen zu erhalten .

Antwort: Aus dem neuen Weg von ioctl () von Jonathan Corbet :

ioctl()ist einer der verbleibenden Teile des Kernels, der unter der Big Kernel Lock (BKL) läuft. In der Vergangenheit ermöglichte die Verwendung der BKL bei lang laufenden ioctl()Methoden lange Latenzen für nicht verwandte Prozesse.

Folgt eine Erklärung des Pflasters , die eingeführt unlocked_ioctlund compat_ioctlin 2.6.11. Die Entfernung des ioctlFeldes geschah viel später in 2.6.36.

Erläuterung: Bei ioctlder Ausführung wurde die Big Kernel Lock (BKL) verwendet, sodass zur gleichen Zeit nichts anderes ausgeführt werden konnte. Dies ist auf einem Multiprozessor-Rechner sehr schlecht, so dass große Anstrengungen unternommen wurden, um die BKL loszuwerden. Zunächst unlocked_ioctlwurde vorgestellt. Hiermit kann jeder Treiberautor auswählen, welches Schloss stattdessen verwendet werden soll. Da dies schwierig sein kann, gab es eine Übergangsphase, in der alte Treiber noch funktionierten (verwendeten ioctl), neue Treiber jedoch die verbesserte Benutzeroberfläche ( unlocked_ioctl) verwenden konnten. Schließlich wurden alle Treiber konvertiert und ioctlkonnten entfernt werden.

compat_ioctlist eigentlich nicht verwandt, obwohl es zur gleichen Zeit hinzugefügt wurde. Der Zweck besteht darin, 32-Bit-Userland-Programmen das Tätigen von ioctlAufrufen auf einem 64-Bit-Kernel zu ermöglichen. Die Bedeutung des letzten zu verwendenden Arguments ioctlhängt vom Treiber ab, sodass eine fahrerunabhängige Konvertierung nicht möglich ist.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Ich habe die neueste ioctl-Quelle durchgesehen und festgestellt, dass der Syscall einige Überprüfungen durchführt und dann hierher springt . Wissen Sie, wo ich weitere Informationen zum ioctl-System erhalten kann? Ich bin daran interessiert, wie ioctl-Befehle für Zeichendateien an den entsprechenden Treiber weitergeleitet werden. Geschieht unlocked_ioctldies dadurch? Die Tatsache, dass ein Funktionszeiger pro Datei verwendet wird (in diesem Fall a struct file), scheint mir nahe zu sein. Ist das unlocked_ioctlfür Zeichendateien bei der Treiberinitialisierung registriert mknod?
Sherrellbc
1
@sherrellbc Der Gerätetreiber registriert das Dateihandhabungsmethoden , wie beispielsweise unlocked_ioctlin ein , struct file_opswenn es beginnt, und sie werden aus den bevölkerten struct file_opsin das Dateiobjekt , wenn die Datei geöffnet wird. mknodspielt dabei keine rolle.
Gilles 'SO- hör auf böse zu sein'
Aha. Ich dachte, ein Gerätetreiber muss zuerst mknodseine Schnittstelle über ein Zeichengerät verfügbar machen, bevor er die zugehörigen Dateioperationen zu sich selbst (über unlocked_ioctl) umleitet .
Sherrellbc
4

Es gibt Fälle, in denen die Ersetzung der (include / linux / fs.h) struct file_operations-Methode ioctl () zu compat_ioctl () in Kernel 2.6.36 nicht funktioniert (z. B. für einige Gerätetreiber) und unlocked_ioctl () verwendet werden muss.


quelle