多くの人がオンラインで参照しているのを見ました。
arch/x86/entry/syscalls/syscall_64.tbl
システムコールテーブルの場合はうまく機能します。しかし、それを参考にしている人がたくさんいました。
/include/uapi/asm-generic/unistd.h
これは通常ヘッダーパッケージにあります。どのようにsyscall_64.tbl
表示しますか?
0 common read sys_read
正しい答えをunistd.h
表示してください。
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
__NR_read
これにより、次のように表示されます。
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
なぜ1ではなく63ですか?をどのように理解する必要がありますか/include/uapi/asm-generic/unistd.h
?/usr/include/asm/
まだある
/usr/include/asm/unistd_x32.h
#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)
/usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
/usr/include/asm/unistd_32.h
#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
unistd
誰かがこれらのファイルの違いを教えてもらえますか?unistd.h
どのように動作するか説明してください。システムコールテーブルを見つけるための最良の方法は何ですか?
ベストアンサー1
この種のことを調べるとき、コンパイラに直接尋ねることが役に立つことがわかりました。端末で標準C/GCC事前定義マクロを印刷する細部):
printf SYS_read | gcc -include sys/syscall.h -E -
これは、関連するヘッダー(Debianの場合)が、、、およびであることを/usr/include/x86_64-linux-gnu/sys/syscall.h
示し/usr/include/x86_64-linux-gnu/asm/unistd.h
、/usr/include/x86_64-linux-gnu/asm/unistd_64.h
x86-64ではゼロの/usr/include/x86_64-linux-gnu/bits/syscall.h
システムコール番号を印刷します。read
クロスコンパイラ環境で適切なシステムヘッダをインストールすると、他のアーキテクチャのシステムコール番号を見つけることができます。 32ビットx86の場合、これは簡単です。
printf SYS_read | gcc -include sys/syscall.h -m32 -E -
別のヘッダー ファイルが含まれ、/usr/include/asm/unistd_32.h
数字 3 を印刷します。
したがって、ユーザースペースの観点からは、32ビットx86システムコールはで定義され、asm/unistd_32.h
64ビットx86システムコールはで定義されますasm/unistd_64.h
。asm/unistd_x32.h
使用x32 ABI。
uapi/asm-generic/unistd.h
アーキテクチャ固有のシステムコールテーブルを持たないアーキテクチャで使用されるデフォルトのシステムコールを一覧表示します。
カーネルでは、参照はわずかに異なり、アーキテクチャによって異なります(共通システムコールテーブルを使用しないアーキテクチャの場合)。これはまさにこのようなファイルが入ってくるところです(最終的にはarch/x86/entry/syscalls/syscall_64.tbl
ユーザースペースなどでunistd_64.h
使用されるヘッダファイルを生成します)。そのトピックに関する 2 つの LWN 記事で、システムコールの詳細を確認できます。システムコール分析第1部そしてシステムコール分析第2部。