Yanıtlar:
Dosya /proc/kallsyms
, çalışan çekirdeğin tüm sembollerini listeler. Kural olarak, sistem çağrıları ile başlayan bir adı vardır sys_
. 64 bit sistemde, 32 bit programların sistem çağrıları ile başlayan bir adı vardır sys32_
. Kesinlikle konuşmak gerekirse, bu sistem çağrısı değil, iç çekirdek işlevlerini listeler, ancak yazışmanın işe yaradığını düşünüyorum (her sistem çağrısı işi yapmak için bir iç çekirdek işlevini çağırır ve adı her zaman önceden sys_
eklenen sistem çağrısının adıdır. ).
</proc/kallsyms sed -n 's/.* sys_//p'
Sistem çağrıları çok yavaş değiştiği için bu genellikle yararlı bir bilgi değildir. İsteğe bağlı bileşenler, cihazlar ( kesildiğinde ve kesmediğinde ioctl ile ), dosya sistemleri, soketler vb. Gibi genel özellikleri kullanarak mevcut sistem çağrıları açısından işlevsellik sağlar. sistem destekliyor. Diğer dahili işlev adları da çok hızlı değişmediği için yardımcı olmaz: bir çekirdek sürümde bazı özellikleri uygulayan işlevin adı sonraki sürümde değişebilir.read
write
Bu yanıtı yazarken yeni alternatifler bulmaya devam ettim, bu yüzden her biri hakkında biraz detay yazdım ve bazı istatistikler yaptım. Temel olarak, aşağıdakilerden birini yapabilirsiniz:
/proc
)./sys
Dizini kullanın .Matematiği yaptıktan sonra /sys
, sistem çağrılarının sayısı açısından en iyi sonucu verdiği için (alternatiflerim arasında) dosya sistemini kullanmanızı tavsiye ederim . Diğer püf noktaları hakkında okumak istemiyorsanız, doğrudan o bölüme atlayabilirsiniz.
Bazılarını özleyebilmenize rağmen, apropos
bölüm 2'ye (sistem çağrıları) ait tüm sayfaları listelemek için kullanabilirsiniz :
$ apropos -s2 . | awk '{print $1}' | column
column
Süslü sütunlu çıktı istemiyorsanız kaldırın .
Az önce öğrendim, ancak sistem çağrıları hakkında bir Linux man sayfası var ve bunların çoğunu bulabileceksiniz.
$ man syscalls
Ayrıca ilginç olabilecek bu iki web sitesine rastladım:
Düzenleme: Şimdi, hangi sistem çağrılarının kullanılabilir olduğunu belirlemek için programlı (veya en azından, belgelenmiş özelliklere dayanmadan) söz konusu olduğunda, çekirdeğin en azından formu altında değil, sistem çağrıları bir tablo tutmaz korkarım (muhtemelen onları manipüle etmeyi beklediğiniz gibi) bir dize listesi. Bu düzeyde, işlev adları yerine işlev adresleri ve işaretçiler hakkında daha fazla konuşuyoruz.
/usr/include
Dizine göz attım ve grep
birkaç şey edindim: Aşağıdaki dizinleri ilginç bulabilirsiniz. Mimarinize ve dağıtımınıza bağlı olarak bazıları makinenizde farklı olabilir, ancak eminim bunları uyarlayabilirsiniz.
Bu dosyada işlev tanımları arayarak, orada tam olarak tanımlanmasalar bile birçok sistem çağrısına rastlarsınız. grep
Bu dizinlerde birkaç s koştum ve bazı sistem çağrılarından bahsedebildim. İşte bir örnek:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
Yani, bazılarını bulmak için başka bir yol tahmin ediyorum:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
Başka bir çözüm, çekirdek kaynak kodunun kendisini (ve sadece üstbilgileri değil!) Kullanmak ve verimli bir şekilde aramak için bir yol bulmaktır. Çekirdek 303395ac3bf3e2cb488435537d416bc840438fcb işlediğinden , bunu öncekinden biraz daha kolay bulabilirsiniz. İşte 3.13 için bir örnek (ki bu benim çekirdeğim):
$ 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
Şimdi gerçek syscalls tablosuna sahip olduğunuza göre, sadece göz atın:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
Çalışan çekirdek sürümünüze ve mimariye bağlı olarak dosyayı doğrudan git.kernel.org adresinden indirmek için uname
ve öğesini kullanarak bir yol bulabilirsiniz .arch
tbl
/sys
Dosya sistemini kullanmaGilles'in cevabı bana biraz ilham verdi ve bu sistem çağrılarını içeride bulabilirsiniz /sys/kernel/debug/tracing/events/syscalls
. Bu dizin, sistemdeki her bir sistem çağrısının kullanımını izlemek için kullanılır. Her sistem aramasında iki dizin vardır:
Bu nedenle, kullanarak ls
, grep
ve cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
Sistemimde:
grep
-ing __SYSCALL
başlık dosyalarında 212 sistem çağrısı ortaya çıktı./sys
Açıklanan 290 sistem çağrısı kullanma .Şimdi, eğer her şeyi bir araya getirirsem ...
$ 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
İşte başlıyoruz, 707 sistem çağırıyor! Tabii ki, bu sayı bir "sistem çağrısı" nın çok esnek bir tanımını yansıtmaktadır, çünkü 3.13'ün sadece 274 sistem çağrısı sağlaması beklenmektedir (okuma /sys
en yakın çözüm gibi görünmektedir).
Tüm cevaplar iyi.
Belirli bir Sistem Çağrısı adı arıyorsanız:
$ cat /proc/kallsyms | grep <sys_call_name>
Tüm Sistem Çağrılarının bir listesini arıyorsanız:
$ cat /proc/kallsyms
/proc/kallsyms
herhangi bir dosya gibi değiştirilebildiğinden, onu bir programda kullanmak oldukça kolay hale gelir.