Odpowiedzi:
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.
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.
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):
$ apropos -s2 . | awk '{print $1}' | column
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.
$ man syscalls
Natknąłem się również na te dwie strony, które mogą być interesujące:
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 i grep
-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:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
Domyślam się, że innym sposobem na znalezienie niektórych z nich byłoby:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
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):
$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/arch/x86/syscalls/syscall_64.tbl?id=refs/tags/v3.13 -O syscall_64.tbl
Teraz, gdy masz już tabelę syscalls, po prostu ją przejrzyj:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
Możesz znaleźć sposób, używając uname
i arch
, aby pobrać tbl
plik bezpośrednio z git.kernel.org , w oparciu o twoją wersję jądra i architekturę.
/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
i cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
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 ...
$ apropos -s2 . | awk '{print $1}' > system_calls.txt
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')' >> system_calls.txt
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl >> system_calls.txt
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3 >> system_calls.txt
$ sort < system_calls.txt | uniq | wc -l
707
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).
Wszystkie odpowiedzi są w porządku.
Jeśli szukasz konkretnej nazwy wywołania systemowego:
$ cat /proc/kallsyms | grep <sys_call_name>
Jeśli szukasz listy wszystkich wywołań systemowych:
$ cat /proc/kallsyms
/proc/kallsyms
można nim manipulować jak każdym innym plikiem, korzystanie z niego w programie staje się dość łatwe.