Linuxシステムコールテーブルはどこにありますか?

Linuxシステムコールテーブルはどこにありますか?

多くの人がオンラインで参照しているのを見ました。

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.hx86-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.h64ビットx86システムコールはで定義されますasm/unistd_64.hasm/unistd_x32.h使用x32 ABI

uapi/asm-generic/unistd.hアーキテクチャ固有のシステムコールテーブルを持たないアーキテクチャで使用されるデフォルトのシステムコールを一覧表示します。

カーネルでは、参照はわずかに異なり、アーキテクチャによって異なります(共通システムコールテーブルを使用しないアーキテクチャの場合)。これはまさにこのようなファイルが入ってくるところです(最終的にはarch/x86/entry/syscalls/syscall_64.tblユーザースペースなどでunistd_64.h使用されるヘッダファイルを生成します)。そのトピックに関する 2 つの LWN 記事で、システムコールの詳細を確認できます。システムコール分析第1部そしてシステムコール分析第2部

おすすめ記事