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_ioctl
und compat_ioctl
in 2.6.11. Die Entfernung des ioctl
Feldes geschah viel später in 2.6.36.
Erläuterung: Bei ioctl
der 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_ioctl
wurde 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 ioctl
konnten entfernt werden.
compat_ioctl
ist eigentlich nicht verwandt, obwohl es zur gleichen Zeit hinzugefügt wurde. Der Zweck besteht darin, 32-Bit-Userland-Programmen das Tätigen von ioctl
Aufrufen auf einem 64-Bit-Kernel zu ermöglichen. Die Bedeutung des letzten zu verwendenden Arguments ioctl
hängt vom Treiber ab, sodass eine fahrerunabhängige Konvertierung nicht möglich ist.
unlocked_ioctl
dies dadurch? Die Tatsache, dass ein Funktionszeiger pro Datei verwendet wird (in diesem Fall astruct file
), scheint mir nahe zu sein. Ist dasunlocked_ioctl
für Zeichendateien bei der Treiberinitialisierung registriertmknod
?unlocked_ioctl
in ein ,struct file_ops
wenn es beginnt, und sie werden aus den bevölkertenstruct file_ops
in das Dateiobjekt , wenn die Datei geöffnet wird.mknod
spielt dabei keine rolle.mknod
seine Schnittstelle über ein Zeichengerät verfügbar machen, bevor er die zugehörigen Dateioperationen zu sich selbst (überunlocked_ioctl
) umleitet .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