Jaka jest różnica między ioctl (), unlocked_ioctl () impat_ioctl ()?

38

Idąc za pośrednictwem kodu źródłowego Linuksa 2.6.36 w lxr.linux.no , nie mogłem znaleźć ioctl()metodę w file_operations. Zamiast tego znalazłem dwa nowe połączenia: unlocked_ioctl()i compat_ioctl(). Jaka jest różnica między ioctl(), unlocked_ioctl()i compat_ioctl()?

Sen
źródło

Odpowiedzi:

39

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_ioctli compat_ioctldo 2.6.11. Usunięcie ioctlpola się dużo później, w 2.6.36.

Objaśnienie: Kiedy ioctlzostał 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_ioctlzostał 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 ioctlmogły zostać usunięte.

compat_ioctljest faktycznie niepowiązany, mimo że został dodany w tym samym czasie. Jego celem jest umożliwienie 32-bitowym programom użytkownika wykonywania ioctlpołączeń na 64-bitowym jądrze. Znaczenie ostatniego argumentu ioctlzależy od sterownika, więc nie ma możliwości przeprowadzenia konwersji niezależnej od sterownika.

Gilles „SO- przestań być zły”
źródło
1
Spoglądałem na najnowsze źródło ioctl i zobaczyłem, że syscall wykonuje kilka kontroli, a potem skacze tutaj . Czy wiesz, gdzie mogę uzyskać więcej informacji na temat systemu ioctl? Interesuje mnie sposób, w jaki polecenia ioctl w plikach znaków są kierowane do odpowiedniego sterownika. Czy to przez unlocked_ioctlto się dzieje? Fakt użycia wskaźnika funkcji na plik (w tym przypadku a struct file) wydaje się, że mogę być blisko. Czy unlocked_ioctlpo inicjalizacji sterownika zarejestrowano pliki znaków mknod?
sherrellbc
1
@ sherrellbc Sterownik urządzenia rejestruje metody obsługi plików, takie jak unlocked_ioctlw struct file_opsmomencie jego uruchomienia , i są one wypełniane z obiektu struct file_opsdo obiektu pliku, gdy plik jest otwierany. mknodnie odgrywa w tym żadnej roli.
Gilles „SO- przestań być zły”
Widzę. Myślałem, że sterownik urządzenia musi najpierw mknodujawnić swój interfejs za pomocą urządzenia znakowego, zanim przekieruje powiązane operacje na plikach do siebie (przez unlocked_ioctl).
sherrellbc
4

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