Czy istnieje sposób na uzyskanie liczby lub listy wywołań systemowych obsługiwanych przez aktualnie działające jądro Linuksa? Chcę więc znaleźć sposób na „odczytanie” tabeli syscall działającego jądra.
źródło
Czy istnieje sposób na uzyskanie liczby lub listy wywołań systemowych obsługiwanych przez aktualnie działające jądro Linuksa? Chcę więc znaleźć sposób na „odczytanie” tabeli syscall działającego jądra.
Plik /proc/kallsyms
zawiera wszystkie symbole działającego jądra. Zgodnie z konwencją wywołania systemowe mają nazwy zaczynające się od sys_
. W systemie 64-bitowym wywołania systemowe programów 32-bitowych zaczynają się od sys32_
. Ściśle mówiąc, zawiera listę wewnętrznych funkcji jądra, a nie wywołania systemowego, ale myślę, że korespondencja działa (każde wywołanie systemowe wywołuje funkcję wewnętrznego jądra w celu wykonania zadania i myślę, że nazwa jest zawsze nazwą wywołania systemowego z sys_
dopisanym ).
</proc/kallsyms sed -n 's/.* sys_//p'
Zwykle nie jest to użyteczna informacja, ponieważ wywołania systemowe zmieniają się bardzo powoli. Opcjonalne komponenty zapewniają funkcjonalność w zakresie istniejących wywołań systemowych, wykorzystując ogólne funkcje, takie jak urządzenia (z ioctl, kiedy read
i write
nie wycina go), systemy plików, gniazda itp. Określenie listy obsługiwanych wywołań systemowych nie powie nic na temat funkcji obsługiwany przez system. Inne wewnętrzne nazwy funkcji również nie pomogą, ponieważ zmieniają się bardzo szybko: nazwa funkcji, która implementuje niektóre funkcje w jednej wersji jądra, może ulec zmianie w następnej wersji.
/proc/kallsyms
można nim manipulować jak każdym innym plikiem, korzystanie z niego w programie staje się dość łatwe.TL; DR
Pisząc tę odpowiedź, wciąż znajdowałem nowe alternatywy, więc po prostu napisałem trochę szczegółów na temat każdej z nich i zrobiłem statystyki. Zasadniczo możesz:
/proc
)./sys
katalogu.Po wykonaniu matematyki polecam (wśród moich alternatyw) korzystanie z
/sys
systemu plików, ponieważ wydaje się, że daje najlepszy wynik pod względem liczby wywołań systemowych. Możesz przejść bezpośrednio do tej sekcji, jeśli nie chcesz czytać o innych sztuczkach.Korzystanie z zasobów dokumentacji
Chociaż możesz przegapić niektóre z nich, możesz użyć
apropos
do wyświetlenia wszystkich stron podręcznika należących do sekcji 2 (wywołania systemowe):Usuń,
column
jeśli nie chcesz fantazyjnych wyników skolumnizowanych.Właśnie się o tym dowiedziałem, ale jest strona podręcznika systemowego Linuksa na temat wywołań systemowych, w której można znaleźć większość z nich.
Natknąłem się również na te dwie strony, które mogą być interesujące:
Korzystanie z plików nagłówków
Edycja: Teraz, jeśli chodzi o programowe (lub przynajmniej bez polegania na udokumentowanych funkcjach) określanie dostępnych wywołań systemowych, obawiam się, że jądro nie przechowuje tabeli swoich wywołań systemowych, przynajmniej nie w formie lista ciągów znaków (jak zapewne można się nimi posługiwać). Na tym poziomie mówimy raczej o adresach funkcji i wskaźnikach, niż o nazwach funkcji.
Właśnie przejrzałem mój
/usr/include
katalog igrep
-ed kilka rzeczy: możesz zainteresować następujące katalogi. Niektóre z nich mogą różnić się na twoim komputerze, w zależności od architektury i dystrybucji, ale jestem pewien, że będziesz w stanie je dostosować.Szukając definicji funkcji w tym pliku, natrafisz na wiele wywołań systemowych, nawet jeśli nie zostaną one w pełni zdefiniowane. Uruchomiłem kilka
grep
sekund w tych katalogach i udało mi się znaleźć wzmianki o niektórych wywołaniach systemowych. Oto przykład:Domyślam się, że innym sposobem na znalezienie niektórych z nich byłoby:
Używanie kodu źródłowego jądra i jego tabeli syscall
Innym rozwiązaniem jest użycie samego kodu źródłowego jądra (a nie tylko nagłówków!) I znalezienie sposobu na jego efektywne przeszukiwanie. Ponieważ jądro zatwierdza 303395ac3bf3e2cb488435537d416bc840438fcb , może to być nieco łatwiejsze niż wcześniej. Oto przykład dla 3.13 (który jest moim jądrem):
Teraz, gdy masz już tabelę syscalls, po prostu ją przejrzyj:
Możesz znaleźć sposób, używając
uname
iarch
, aby pobraćtbl
plik bezpośrednio z git.kernel.org , w oparciu o twoją wersję jądra i architekturę.Korzystanie z
/sys
systemu plikówOdpowiedź Gillesa dała mi trochę inspiracji i możesz znaleźć te wywołania systemowe w środku
/sys/kernel/debug/tracing/events/syscalls
. Ten katalog służy do monitorowania użycia każdego wywołania systemowego w systemie. Każde połączenie systemowe ma dwa katalogi:Dlatego, korzystając
ls
,grep
icut
...Statystyki
W moim systemie:
grep
-ing do__SYSCALL
w plikach nagłówkowych ujawniła 212 wywołań systemowych./sys
ujawnionych 290 wywołań systemowych.Teraz, jeśli połączę wszystko razem ...
Proszę bardzo, 707 połączeń systemowych! Oczywiście liczba ta odzwierciedla bardzo elastyczną definicję „wywołania systemowego”, ponieważ 3.13 ma zapewniać tylko 274 wywołań systemowych (odczyt
/sys
wydaje się być najbliższym rozwiązaniem).źródło
Wszystkie odpowiedzi są w porządku.
Jeśli szukasz konkretnej nazwy wywołania systemowego:
Jeśli szukasz listy wszystkich wywołań systemowych:
źródło