我正在关注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.h
和unistd_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
...