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



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

当我到达"如何添加自己的 Linux 系统调用"部分时,讲师显示所有系统调用 ID(以 __NR 开头的宏)都存在于 arch/x86/include/asm/unistd_32.h 或 unistd_64.h 中(取决于目标)。

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

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

Arch Linux 在/usr/include/asm/中发布了unistd_32.hunistd_64.h。 只需查看这些标头,除非您正在修改内核以添加新的系统调用。

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

在我最新的 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 开始,供用户空间使用的unistd_32.h是从其他文件构建的

https://github.com/torvalds/linux/search?q=unistd_32.h&unscoped_q=unistd_32.h 在arch/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
...

相关内容

最新更新