Antworten:
Die Datei /proc/kallsyms
listet alle Symbole des laufenden Kernels auf. Konventionell haben Systemaufrufe einen Namen, der mit beginnt sys_
. Auf einem 64-Bit-System haben Systemaufrufe für 32-Bit-Programme einen Namen, der mit beginnt sys32_
. Genau genommen listet dies interne Kernelfunktionen auf, nicht Systemaufrufe, aber ich denke, dass die Korrespondenz funktioniert (jeder Systemaufruf ruft eine interne Kernelfunktion auf, um die Aufgabe zu erledigen, und ich denke, der Name ist immer der Name des Systemaufrufs mit sys_
vorangestelltem Namen ).
</proc/kallsyms sed -n 's/.* sys_//p'
Dies sind normalerweise keine nützlichen Informationen, da sich Systemaufrufe sehr langsam ändern. Optionale Komponenten bieten Funktionen in Bezug auf vorhandene Systemaufrufe, wobei allgemeine Funktionen wie Geräte (mit ioctl, wenn read
und write
schneidet es nicht), Dateisysteme, Sockets usw. verwendet werden. Wenn Sie die Liste der unterstützten Systemaufrufe ermitteln, erhalten Sie keine Informationen zu den Funktionen dass das System unterstützt. Andere interne Funktionsnamen helfen ebenfalls nicht, da sich diese sehr schnell ändern: Der Name der Funktion, die eine Funktion in einer Kernelversion implementiert, kann sich in der nächsten Version ändern.
Ich habe beim Schreiben dieser Antwort immer wieder neue Alternativen gefunden, also habe ich nur ein paar Details zu jeder dieser Antworten geschrieben und einige Statistiken erstellt. Grundsätzlich können Sie entweder:
/proc
)./sys
Verzeichnis.Nach dem Rechnen würde ich (unter meinen Alternativen) die Verwendung des /sys
Dateisystems empfehlen , da es hinsichtlich der Anzahl der Systemaufrufe das beste Ergebnis zu liefern scheint. Sie können direkt zu diesem Abschnitt springen, wenn Sie nicht über die anderen Tricks lesen möchten.
Während Sie möglicherweise einige davon verpassen, können Sie damit apropos
alle zu Abschnitt 2 gehörenden Manpages (Systemaufrufe) auflisten:
$ apropos -s2 . | awk '{print $1}' | column
Entfernen column
Sie diese Option, wenn Sie keine ausgefallene kolumnisierte Ausgabe wünschen.
Ich habe es gerade herausgefunden, aber es gibt eine Linux-Manpage über Systemaufrufe, und Sie werden die meisten darin finden können.
$ man syscalls
Ich bin auch auf diese beiden Websites gestoßen, die interessant sein könnten:
Bearbeiten: Wenn es darum geht, programmgesteuert (oder zumindest ohne sich auf dokumentierte Funktionen zu verlassen) zu bestimmen, welche Systemaufrufe verfügbar sind, führt der Kernel leider keine Tabelle seiner Systemaufrufe, zumindest nicht in Form von eine Liste von Zeichenfolgen (wie Sie wahrscheinlich erwarten würden, sie zu manipulieren). Auf dieser Ebene geht es eher um Funktionsadressen und -zeiger als um Funktionsnamen.
Ich habe gerade mein /usr/include
Verzeichnis durchsucht und grep
ein paar Dinge durchgesehen: Vielleicht finden Sie die folgenden Verzeichnisse interessant. Einige davon können je nach Architektur und Distribution auf Ihrem Computer unterschiedlich sein, aber ich bin sicher, dass Sie sie anpassen können.
Wenn Sie in dieser Datei nach Funktionsdefinitionen suchen, werden Sie auf viele Systemaufrufe stoßen, die dort jedoch nicht vollständig definiert sind. Ich habe einige grep
Sekunden in diesen Verzeichnissen ausgeführt und konnte einige Systemaufrufe erwähnen. Hier ist ein Beispiel:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
Ich vermute also, dass ein anderer Weg, einige von ihnen zu finden, wäre:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
Eine andere Lösung besteht darin, den Kernel-Quellcode selbst (und nicht nur die Header!) Zu verwenden und einen Weg zu finden, ihn effizient zu durchsuchen. Da das Kernel 303395ac3bf3e2cb488435537d416bc840438fcb festschreibt , ist dies möglicherweise etwas einfacher als zuvor. Hier ist ein Beispiel für 3.13 (das ist mein Kernel):
$ 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
Nachdem Sie die eigentliche Syscalls-Tabelle erhalten haben, durchsuchen Sie sie einfach:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
Sie könnten einen Weg finden, die Datei mit uname
und direkt von git.kernel.org herunterzuladenarch
tbl
, basierend auf Ihrer laufenden Kernelversion und .
/sys
DateisystemsGilles 'Antwort hat mich ein wenig inspiriert, und vielleicht finden Sie diese Systemaufrufe darin /sys/kernel/debug/tracing/events/syscalls
. Dieses Verzeichnis wird verwendet, um die Verwendung jedes Systemaufrufs auf dem System zu überwachen. Jeder Systemaufruf enthält zwei Verzeichnisse:
Daher ist die Verwendung ls
, grep
und cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
Auf meinem System:
grep
-ing für __SYSCALL
in den Header-Dateien wurden 212 Systemaufrufe angezeigt./sys
offenbarten 290 Systemaufrufen.Nun, wenn ich alles zusammenbringe ...
$ 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
Los geht's, 707 Systemaufrufe! Natürlich spiegelt diese Nummer eine sehr flexible Definition eines "Systemaufrufs" wider, da 3.13 nur 274 Systemaufrufe liefern soll (Lesen /sys
scheint die naheliegendste Lösung zu sein).
Alle Antworten sind in Ordnung.
Wenn Sie nach einem bestimmten Systemaufrufnamen suchen:
$ cat /proc/kallsyms | grep <sys_call_name>
Wenn Sie nach einer Liste aller Systemaufrufe suchen:
$ cat /proc/kallsyms
/proc/kallsyms
es wie jede andere Datei bearbeitet werden kann, ist es außerdem recht einfach, es in einem Programm zu verwenden.