システムコール番号→ランタイム名マッピング

システムコール番号→ランタイム名マッピング

観察されたシステムコールの数を解決する方法はありますか?

SYS_345(0xe, 0xbff94188, 0x2, 0x4000, 0xb6526000) = 2

ソースコードを見つけずに実行中のカーネルのシンボル名に追加しますか?

編集するユースケースが廃止されましたストレスカーネルのソースコードを検索するのは面倒な外部システムのバイナリです。

ベストアンサー1

私が知る限り、実行中のカーネルでシステムコール番号とシステムコール名のマッピングを決定する保証された方法はありません。システムコール番号に対応するコールを見つけるには、常にソースコードを掘り下げる必要があります。

これらのマッピングを実行する必要があるソフトウェア開発者は、自分のシステムコールのリストを維持する傾向があります。strace。これは、そのようなプログラムの特定のバージョンが特定のカーネルに比べて古くなっている可能性があることを意味しますが、実際にシステムコールはこれが大きな問題にならないほどゆっくり追加されます。

カーネルソースコードから値を見つけることでさえ、アーキテクチャによってはマッピングが異なる方法で保存されるので複雑です。 x86やそのような「シンプル」アーキテクチャをマッピングする場合でもシステムコールテーブル、特定の番号でダイヤルされた電話を見つけるには、複数の場所で複数回検索する必要があります。

システムにGCCとシステムヘッダファイルがある限り、システムマッピングを見つけるための迅速で信頼性の高い方法は、後者を使用することです。例えば、

awk 'BEGIN { print "#include <sys/syscall.h>" } /p_syscall_meta/ { syscall = substr($NF, 19); printf "syscalls[SYS_%s] = \"%s\";\n", syscall, syscall }' /proc/kallsyms |
sort -u | gcc -E -P - | less

ここからLinuxシステムコールのリストを抽出し、/proc/kallsymsCコード(またはCプリプロセッサコード)を作成してプリプロセッサに供給すると、次のような結果が得られます。

syscalls[288] = "accept4";
syscalls[43] = "accept";
syscalls[21] = "access";
syscalls[163] = "acct";
syscalls[248] = "add_key";

など。必要に応じて、GCCフラグを使用してカーネルと一致するようにアーキテクチャを調整できます(例えば -m32i386システムコール番号または-mx32x86-32番号を確認してください。

あなたの場合、345はi386のシステムコール番号であり、sendmmsgx86-64またはx86-32のいずれとも一致しません。これは2011年の2.6.39時期に導入されたため、カーネルと関連プログラムの基礎として2.6.32を長い間使用しているシステムはこれを知りませんstrace。 )と最新のカーネル)。

おすすめ記事