Apakah ada cara untuk mendapatkan nomor atau daftar panggilan sistem yang didukung oleh Linux Kernel yang saat ini dijalankan? Jadi saya ingin mencari cara untuk 'membaca' tabel syscall dari kernel yang sedang berjalan.
sumber
Apakah ada cara untuk mendapatkan nomor atau daftar panggilan sistem yang didukung oleh Linux Kernel yang saat ini dijalankan? Jadi saya ingin mencari cara untuk 'membaca' tabel syscall dari kernel yang sedang berjalan.
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.
/proc/kallsyms
dapat dimanipulasi seperti file lainnya, menjadi sangat mudah untuk menggunakannya dalam suatu program.TL; DR
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.Menggunakan sumber dokumentasi
Meskipun Anda mungkin melewatkan beberapa di antaranya, Anda dapat menggunakan
apropos
untuk mendaftar semua halaman manual milik bagian 2 (panggilan sistem):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.
Saya juga menemukan dua situs web ini yang menarik:
Menggunakan file header
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 dangrep
-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:Jadi, saya menduga cara lain untuk menemukan beberapa di antaranya adalah:
Menggunakan kode sumber kernel dan tabel syscall-nya
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):
Sekarang setelah Anda mendapatkan tabel syscalls yang sebenarnya, cukup telusuri:
Anda dapat menemukan cara, menggunakan
uname
danarch
, untuk mengunduhtbl
file langsung dari git.kernel.org , berdasarkan versi dan arsitektur kernel yang Anda jalankan.Menggunakan
/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
dancut
...Statistik
Di sistem saya:
grep
untuk__SYSCALL
dalam file header mengungkapkan 212 panggilan sistem./sys
290 panggilan sistem yang terungkap.Sekarang, jika saya menyatukan semuanya ...
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).sumber
Semua jawaban baik-baik saja.
Jika Anda mencari nama Panggilan Sistem tertentu:
Jika Anda mencari daftar semua Panggilan Sistem:
sumber