Meta-odpowiedź: Wszystkie surowe rzeczy, które dzieją się w jądrze Linuksa, przechodzą przez lkml (listę mailingową jądra Linuksa) . Aby uzyskać szczegółowe wyjaśnienia, przeczytaj lub wyszukaj lwn (cotygodniowe wiadomości na temat systemu Linux) .
Odpowiedź: Od nowego sposobu ioctl () przez Jonathan Corbet :
ioctl()
jest jedną z pozostałych części jądra, która działa pod Big Kernel Lock (BKL). W przeszłości użycie BKL umożliwiało długotrwałym ioctl()
metodom tworzenie długich opóźnień dla niepowiązanych procesów.
Wyjaśnia wyjaśnienie poprawki, która wprowadziła unlocked_ioctl
i compat_ioctl
do 2.6.11. Usunięcie ioctl
pola się dużo później, w 2.6.36.
Objaśnienie: Kiedy ioctl
został wykonany, wymagał Big Kernel Lock (BKL), więc nic innego nie mogło zostać wykonane jednocześnie. Jest to bardzo złe na maszynie wieloprocesorowej, więc było wiele wysiłku, aby pozbyć się BKL. Najpierw unlocked_ioctl
został wprowadzony. Pozwala każdemu pisarzowi sterownika wybrać, jakiej blokady użyć zamiast tego. Może to być trudne, więc był okres przejściowy, podczas którego stare sterowniki nadal działały (używały ioctl
), ale nowe sterowniki mogły korzystać z ulepszonego interfejsu ( unlocked_ioctl
). Ostatecznie wszystkie sterowniki zostały przekonwertowane i ioctl
mogły zostać usunięte.
compat_ioctl
jest faktycznie niepowiązany, mimo że został dodany w tym samym czasie. Jego celem jest umożliwienie 32-bitowym programom użytkownika wykonywania ioctl
połączeń na 64-bitowym jądrze. Znaczenie ostatniego argumentu ioctl
zależy od sterownika, więc nie ma możliwości przeprowadzenia konwersji niezależnej od sterownika.
unlocked_ioctl
to się dzieje? Fakt użycia wskaźnika funkcji na plik (w tym przypadku astruct file
) wydaje się, że mogę być blisko. Czyunlocked_ioctl
po inicjalizacji sterownika zarejestrowano pliki znakówmknod
?unlocked_ioctl
wstruct file_ops
momencie jego uruchomienia , i są one wypełniane z obiektustruct file_ops
do obiektu pliku, gdy plik jest otwierany.mknod
nie odgrywa w tym żadnej roli.mknod
ujawnić swój interfejs za pomocą urządzenia znakowego, zanim przekieruje powiązane operacje na plikach do siebie (przezunlocked_ioctl
).Zdarzają się przypadki, w których zamiana metody (file /operation / fs.h) struct file_operations ioctl () na polic_ioctl () w jądrze 2.6.36 nie działa (np. W przypadku niektórych sterowników urządzeń) i należy użyć unlocked_ioctl ().
źródło