Linux 内核 5.0.1 中为 x86 arch 定义的系统调用 ID 在哪里?

Where are System Call IDs defined for x86 arch in Linux Kernel 5.0.1?

我正在关注 Linux 系统编程视频教程。

当我到达 "how to add your own Linux System Call" 部分时,讲师显示所有系统调用 ID(以 __NR 开头的宏)都存在于 arch/x86/include/asm/unistd_32.h 或 unistd_64.h(取决于目标)。

但是在我的源代码(linux-5.0.1) 中我没有看到那些文件,只有一个unistd.h 不包含系统调用ID。这些文件是移到了别处还是 x86 现在没有自己的系统调用 table。

编辑:我从kernel.org下载了最新的内核源代码,我正在尝试修改它。我在上述位置找不到 unistd_32.h 和 unistd_64.h 文件。我需要先做点什么吗?

Arch Linux 在 /usr/include/asm/ 中发布了 unistd_32.hunistd_64.h。看看那些 headers 除非你正在修改内核以添加新的系统调用。

<asm/unistd.h> 检查宏以确定它是否包含在 32 位或 64 位代码中(并检查 x32),并使用 #include 为目标。

在我的 up-to-date x86-64 Arch 系统上:

$ pacman -Fo /usr/include/asm/unistd*
usr/include/asm/unistd_32.h is owned by core/linux-api-headers 4.7-1
usr/include/asm/unistd_64.h is owned by core/linux-api-headers 4.7-1
usr/include/asm/unistd.h is owned by core/linux-api-headers 4.7-1
usr/include/asm/unistd_x32.h is owned by core/linux-api-headers 4.7-1

在内核源代码本身中,从 3.3 版开始,供 user-space 使用的 unistd_32.h 从其他文件构建的 .

https://github.com/torvalds/linux/search?q=unistd_32.h&unscoped_q=unistd_32.harch/x86/entry/syscalls/Makefile

中找到这个
$(uapi)/unistd_32.h: $(syscall32) $(syshdr)
    $(call if_changed,syshdr)

系统调用表定义在:arch/x86/entry/syscalls/syscall_32.tbl.../syscall_64.tbl

https://github.com/torvalds/linux/tree/6f0d349d922ba44e4348a17a78ea51b7135965b1/arch/x86/entry/syscalls

syscall_32.tbl 的内容如下:

# some comments
0   i386    restart_syscall     sys_restart_syscall     __ia32_sys_restart_syscall
1   i386    exit            sys_exit            __ia32_sys_exit
2   i386    fork            sys_fork            __ia32_sys_fork
3   i386    read            sys_read            __ia32_sys_read
...