Risposte:
Il file /proc/kallsyms
elenca tutti i simboli del kernel in esecuzione. Per convenzione, le chiamate di sistema hanno un nome che inizia con sys_
. Su un sistema a 64 bit, le chiamate di sistema per i programmi a 32 bit hanno un nome che inizia con sys32_
. A rigor di termini, questo elenca le funzioni interne del kernel, non la chiamata di sistema, ma penso che la corrispondenza funzioni (ogni chiamata di sistema invoca una funzione interna del kernel per fare il lavoro, e penso che il nome sia sempre il nome della chiamata di sistema con sys_
anteposto ).
</proc/kallsyms sed -n 's/.* sys_//p'
Di solito non si tratta di informazioni utili, poiché le chiamate di sistema cambiano molto lentamente. I componenti opzionali forniscono funzionalità in termini di chiamate di sistema esistenti, utilizzando funzionalità generali come dispositivi (con ioctl quando read
e write
non lo tagliano), filesystem, socket, ecc. Determinare l'elenco di syscalls supportati non ti dirà nulla sulle funzionalità che il sistema supporta. Altri nomi di funzioni interne non aiuteranno neanche perché cambiano molto rapidamente: il nome della funzione che implementa alcune funzionalità su una versione del kernel potrebbe cambiare sulla versione successiva.
Continuavo a trovare nuove alternative quando scrivevo questa risposta, quindi ho appena scritto un po 'di dettagli su ciascuna di esse e ho creato alcune statistiche. In sostanza, puoi:
/proc
)./sys
directory.Dopo aver fatto i conti, consiglierei (tra le mie alternative) di usare il /sys
filesystem, poiché sembra dare il miglior risultato in termini di numero di chiamate di sistema. Puoi saltare direttamente a quella sezione se non vuoi leggere degli altri trucchi.
Anche se potresti perderne alcuni, puoi usare apropos
per elencare tutte le manpage appartenenti alla sezione 2 (chiamate di sistema):
$ apropos -s2 . | awk '{print $1}' | column
Rimuovere column
se non si desidera un output con colonne di fantasia.
L'ho appena scoperto, ma c'è una pagina man di Linux sulle chiamate di sistema e potrai trovarne la maggior parte.
$ man syscalls
Mi sono anche imbattuto in questi due siti Web che potrebbero essere interessanti:
Modifica: ora, quando si tratta di determinare programmaticamente (o almeno, senza fare affidamento su funzionalità documentate) quali sono le chiamate di sistema disponibili, temo che il kernel non mantenga una tabella delle sue chiamate di sistema, almeno non sotto forma di un elenco di stringhe (come probabilmente ti aspetteresti di manipolarle). A questo livello, stiamo parlando più di indirizzi e puntatori di funzioni, piuttosto che di nomi di funzioni.
Ho appena sfogliato la mia /usr/include
directory e grep
aggiunto alcune cose: potresti trovare interessanti le seguenti directory. Alcuni potrebbero essere diversi sulla tua macchina, a seconda della tua architettura e distribuzione, ma sono sicuro che sarai in grado di adattarli.
Cercando le definizioni delle funzioni in questo file, ti imbatterai in molte chiamate di sistema, anche se non saranno completamente definite in esso. Ho eseguito alcuni grep
secondi in queste directory e sono stato in grado di trovare menzioni di alcune chiamate di sistema. Ecco un esempio:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
Quindi, immagino che un altro modo per trovarne alcuni sarebbe:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
Un'altra soluzione è utilizzare il codice sorgente del kernel stesso (e non solo le intestazioni!) E trovare un modo per cercarlo in modo efficiente. Dal momento che il kernel commette 303395ac3bf3e2cb488435537d416bc840438fcb , potresti trovarlo un po 'più facile di prima. Ecco un esempio per 3.13 (che è il mio 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
Ora che hai ottenuto la tabella syscalls effettiva, basta sfogliarla:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
È possibile trovare un modo, utilizzando uname
e arch
, per scaricare il tbl
file direttamente da git.kernel.org , in base alla versione e all'architettura del kernel in esecuzione.
/sys
filesystemLa risposta di Gilles mi ha dato un po 'di ispirazione e potresti trovare quelle chiamate di sistema all'interno /sys/kernel/debug/tracing/events/syscalls
. Questa directory viene utilizzata per monitorare l'utilizzo di ciascuna chiamata di sistema sul sistema. Ogni syscall contiene due directory:
Pertanto, utilizzando ls
, grep
e cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
Sul mio sistema:
grep
-ing per __SYSCALL
nei file di intestazione ha rivelato 212 chiamate di sistema./sys
290 chiamate di sistema rivelate.Ora, se metto tutto insieme ...
$ 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
Eccoci, 707 chiamate di sistema! Naturalmente, questo numero riflette una definizione molto flessibile di "chiamata di sistema", poiché si suppone che 3.13 fornisca solo 274 chiamate di sistema (la lettura /sys
sembra essere la soluzione più vicina).
Tutte le risposte vanno bene
Se stai cercando un nome di chiamata di sistema specifico:
$ cat /proc/kallsyms | grep <sys_call_name>
Se stai cercando un elenco di tutte le chiamate di sistema:
$ cat /proc/kallsyms
/proc/kallsyms
può essere manipolato come qualsiasi altro file, diventa abbastanza facile usarlo in un programma.