ユーザーアプリケーションがシステムコールを行うと、ソフトウェア割り込み/例外がトリガーされます。ソフトウェア割り込みを生成するためのソースコードを確認するにはどうすればよいですか?
3 に答える
Linux Assembly Howtoで説明されています。また、ウィキペディアのsyscallページ (およびVDSOについても) と、intro(2)およびsyscalls(2)の man ページを読む必要があります。この回答とこの回答も参照してください。Gnu Libcとmusl-libc のソース コードの中も見てください。strace
また、特定のコマンドまたはプロセスによってどのシステムコールが行われたかを調べるために使用することも学びます。
システムに関連する呼び出し規約と Application Binary Interface 仕様も参照してください。x86-64 の場合はこちらです。
昔int 0x80
はカーネルに入る罠がありましたが、最近sysenter
は好まれています。
vsyscall
カーネルによってすべてのプロセスに自動的にマップされたセクションをダンプすることで、コードを取得できます。
$ cat /proc/self/maps
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
詳細については、この記事を確認してください
ソフトウェア割り込みは、Intel x86アセンブリ命令でトリガーできます。int n
ここn
で、は割り込み番号です。システムコールは、ソフトウェア割り込みの特殊なケースです。で手動でシステムコールを行うことができます
mov eax, m
int 0x80
ここm
で、割り込み番号に置き換える必要があります。各機能のオンラインマンページにリンクされている32ビットのシステムコール番号と64ビットのシステムコール番号のリストを次に示します。ebx
また、他のレジスタ( 、ecx
など)を介してパラメータをsyscallに渡す必要があります。これについて詳しくは、こちらをご覧ください。
これは、libcなどの外部ライブラリから独立しているため、syscallを実行する最も一般的な方法であり、インラインアセンブリを使用して、必要に応じてC /C++で実装できます。