Jawaban:
File ini /proc/kallsyms
mencantumkan semua simbol kernel yang sedang berjalan. Secara konvensi, panggilan sistem memiliki nama yang dimulai dengan sys_
. Pada sistem 64-bit, panggilan sistem untuk program 32-bit memiliki nama yang dimulai dengan sys32_
. Sebenarnya, ini mencantumkan fungsi kernel internal, bukan panggilan sistem, tapi saya pikir korespondensi berfungsi (setiap panggilan sistem memanggil fungsi kernel internal untuk melakukan pekerjaan, dan saya pikir namanya selalu nama panggilan sistem dengan sys_
prepended ).
</proc/kallsyms sed -n 's/.* sys_//p'
Ini biasanya bukan informasi yang berguna, karena panggilan sistem berubah sangat lambat. Komponen opsional menyediakan fungsionalitas dalam hal panggilan sistem yang ada, menggunakan fitur umum seperti perangkat (dengan ioctl ketika read
dan write
tidak memotongnya), sistem file, soket, dll. Menentukan daftar syscalls yang didukung tidak akan memberi tahu Anda apa-apa tentang fitur-fitur tersebut. yang didukung sistem. Nama fungsi internal lainnya juga tidak akan membantu karena perubahan ini sangat cepat: nama fungsi yang mengimplementasikan beberapa fitur pada satu versi kernel dapat berubah pada versi berikutnya.
Saya terus mencari alternatif baru ketika menulis jawaban ini, jadi saya hanya menulis sedikit detail tentang masing-masing, dan membuat beberapa statistik. Pada dasarnya, Anda dapat:
/proc
)./sys
direktori.Setelah melakukan perhitungan, saya akan merekomendasikan (di antara alternatif saya) menggunakan sistem /sys
file, karena tampaknya memberikan hasil terbaik dalam hal jumlah panggilan sistem. Anda dapat melompat langsung ke bagian itu jika Anda tidak ingin membaca tentang trik lain.
Meskipun Anda mungkin melewatkan beberapa di antaranya, Anda dapat menggunakan apropos
untuk mendaftar semua halaman manual milik bagian 2 (panggilan sistem):
$ apropos -s2 . | awk '{print $1}' | column
Hapus column
jika Anda tidak ingin output columnised mewah.
Saya baru saja mengetahuinya, tetapi ada halaman manual Linux tentang panggilan sistem, dan Anda akan dapat menemukan sebagian besar di antaranya.
$ man syscalls
Saya juga menemukan dua situs web ini yang menarik:
Sunting: Sekarang, ketika datang ke pemrograman (atau setidaknya, tanpa bergantung pada fitur-fitur yang didokumentasikan) menentukan panggilan sistem apa yang tersedia, saya khawatir kernel tidak menyimpan tabel panggilan sistemnya, setidaknya tidak dalam bentuk daftar string (seperti yang mungkin Anda harapkan untuk memanipulasi mereka). Pada level ini, kita berbicara lebih banyak tentang fungsi alamat dan pointer, daripada nama fungsi.
Saya baru saja melihat-lihat /usr/include
direktori saya dan grep
-ed beberapa hal: Anda mungkin menemukan direktori berikut menarik. Beberapa dari mereka mungkin berbeda pada mesin Anda, tergantung pada arsitektur dan distribusi Anda, tetapi saya yakin Anda akan dapat menyesuaikannya.
Dengan mencari definisi fungsi dalam file ini, Anda akan menemukan banyak panggilan sistem, meskipun mereka tidak akan sepenuhnya didefinisikan di sana. Saya menjalankan beberapa grep
s di direktori ini dan saya dapat menemukan menyebutkan beberapa panggilan sistem. Ini sebuah contoh:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
Jadi, saya menduga cara lain untuk menemukan beberapa di antaranya adalah:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
Solusi lain adalah dengan menggunakan kode sumber kernel itu sendiri (dan bukan hanya header!), Dan menemukan cara untuk mencarinya secara efisien. Karena kernel mengkomit 303395ac3bf3e2cb488435537d416bc840438fcb , Anda mungkin menemukan ini sedikit lebih mudah dari sebelumnya. Berikut adalah contoh untuk 3.13 (yang merupakan kernel saya):
$ 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
Sekarang setelah Anda mendapatkan tabel syscalls yang sebenarnya, cukup telusuri:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
Anda dapat menemukan cara, menggunakan uname
dan arch
, untuk mengunduh tbl
file langsung dari git.kernel.org , berdasarkan versi dan arsitektur kernel yang Anda jalankan.
/sys
sistem fileJawaban Gilles memberi saya sedikit inspirasi, dan Anda mungkin menemukan panggilan sistem itu di dalam /sys/kernel/debug/tracing/events/syscalls
. Direktori ini digunakan untuk memantau penggunaan setiap pemanggilan sistem pada sistem. Setiap syscall memiliki dua direktori di dalamnya:
Karena itu, menggunakan ls
, grep
dan cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
Di sistem saya:
grep
untuk __SYSCALL
dalam file header mengungkapkan 212 panggilan sistem./sys
290 panggilan sistem yang terungkap.Sekarang, jika saya menyatukan semuanya ...
$ 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
Kita mulai, 707 panggilan sistem! Tentu saja, angka ini mencerminkan definisi yang sangat fleksibel dari "pemanggilan sistem", karena 3,13 seharusnya hanya menyediakan 274 pemanggilan sistem (pembacaan /sys
sepertinya merupakan solusi terdekat).
Semua jawaban baik-baik saja.
Jika Anda mencari nama Panggilan Sistem tertentu:
$ cat /proc/kallsyms | grep <sys_call_name>
Jika Anda mencari daftar semua Panggilan Sistem:
$ cat /proc/kallsyms
/proc/kallsyms
dapat dimanipulasi seperti file lainnya, menjadi sangat mudah untuk menggunakannya dalam suatu program.