关于系统调用号和系统调用表
关于系统调用号和系统调用表
1、首先每个体系结构的系统调用编号都不同,例如:
-
x86_64:
arch/x86/entry/syscalls/syscall_64.tbl
: 读取为 0 -
x86:
arch/x86/entry/syscalls/syscall_32.tbl
: 读取为 3 -
arm64::
include/uapi/asm-generic/unistd.h
读取为 63
2.很多人都在线引用这个地址:
arch/x86/entry/syscalls/syscall_64.tbl ,
但是这个地址在内核源码中不存在的
x86_64 架构 在 arch/x86/syscalls/syscall_64.tbl 中定义了自己的映射,比如有一个 sys_read ():
0 common read sys_read
这表明x86_64 上的read()具有系统调用号 0(不是 63),并且具有x86_64 的两个 ABI 的通用实现,即sys_read()。
syscalltbl.sh脚本 负责从syscall_64.tbl表 生成arch/x86/include/generated/asm/syscalls_64.h, 反过来,这个头文件用于填充系统调用表 sys_call_table
sys_call_table 定义在 E:\linux内核\linux-2.6.38.5\arch\x86\kernel\syscall_64.c
/* System call table for x86-64.
我们通常查询时候,是 https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscall_64.c
sys_call_table 数组的大小为 __NR_syscall_max + 1 ,_NR_syscall_max 宏作为给定架构的系统调用最大数量。
*/ #include <linux/linkage.h> #include <linux/sys.h> #include <linux/cache.h> #include <asm/asm-offsets.h> #define __NO_STUBS #define __SYSCALL(nr, sym) extern asmlinkage void sym(void) ; #undef _ASM_X86_UNISTD_64_H #include <asm/unistd_64.h> #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = sym, #undef _ASM_X86_UNISTD_64_H typedef void (*sys_call_ptr_t)(void); extern void sys_ni_syscall(void); const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { /* * Smells like a like a compiler bug -- it doesn't work when the & below is removed. */ [0 ... __NR_syscall_max] = &sys_ni_syscall, #include <asm/unistd_64.h> //指 arch\x86\include\asm\unistd_64.h };
3. 通用系统调用表
下面这个 E:\linux内核\linux-3.12.37\linux-3.12.37\include\uapi\asm-generic\unistd.h 就是通用的,不针对任何特定架构的。 include/uapi/asm-generic/unistd.h
列出的是默认系统调用,这些调用用于没有特定于体系结构的系统调用表
在内核中,引用略有不同,并且是特定于体系结构的(同样,对于不使用通用系统调用表的体系结构)。这就是诸如此类的文件的来源arch/x86/entry/syscalls/syscall_64.tbl
(它们最终会生成在用户空间unistd_64.h
等中使用的头文件)
#define __NR_read 63 __SYSCALL(__NR_read, sys_read)
4、输出系统调用表
[root@aozhejin /usr/local/src/vdso/qita]$printf SYS_read | gcc -include sys/syscall.h -E - # 1 "<stdin>" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "/usr/include/sys/syscall.h" 1 3 4 # 24 "/usr/include/sys/syscall.h" 3 4 # 1 "/usr/include/asm/unistd.h" 1 3 4 # 12 "/usr/include/asm/unistd.h" 3 4 # 1 "/usr/include/asm/unistd_64.h" 1 3 4 # 13 "/usr/include/asm/unistd.h" 2 3 4 # 25 "/usr/include/sys/syscall.h" 2 3 4 # 1 "/usr/include/bits/syscall.h" 1 3 4 # 32 "/usr/include/sys/syscall.h" 2 3 4 # 1 "<command-line>" 2 # 1 "<stdin>" 0
如果想找到32 位 x86 中的系统调用头文件或系统调用号
[root@aozhejin /usr/local/src/vdso/qita]$printf SYS_read | gcc -include sys/syscall.h -m32 -E - # 1 "<stdin>" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "/usr/include/sys/syscall.h" 1 3 4 # 24 "/usr/include/sys/syscall.h" 3 4 # 1 "/usr/include/asm/unistd.h" 1 3 4 # 1 "/usr/include/asm/unistd_32.h" 1 3 4 # 9 "/usr/include/asm/unistd.h" 2 3 4 # 25 "/usr/include/sys/syscall.h" 2 3 4 # 1 "/usr/include/bits/syscall.h" 1 3 4 # 32 "/usr/include/sys/syscall.h" 2 3 4 # 1 "<command-line>" 2 # 1 "<stdin>" 3
输出宏变量定义
[root@aozhejin /usr/local/src/vdso/qita]$echo __GNUC__ | gcc -E - # 1 "<stdin>" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "<stdin>" 4
打印某个c文件中的宏变量:
gcc -E file.c
https://en.wikipedia.org/wiki/X32_ABI
https://github.com/bminor/glibc/blob/glibc-2.35/sysdeps/unix/sysv/linux/x86_64/64/arch-syscall.h#L231
https://github.com/strace/strace/blob/v4.26/linux/x86_64/syscallent.h
https://gitlab.com/strace/strace/-/blob/master/src/linux/x86_64/syscallent.h
https://github.com/strace/strace strace源代码
https://gitlab.com/strace/strace
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/syscalls.h?id=HEAD
http://asm.sourceforge.net/syscall.html
https://stackoverflow.com/questions/6604007/how-can-i-get-a-list-of-linux-system-calls-and-number-of-args-they-take-automati
https://unix.stackexchange.com/questions/421750/where-do-you-find-the-syscall-table-for-linux
https://lwn.net/Articles/604287/
https://github.com/torvalds/linux/blob/v4.17/arch/x86/entry/syscalls/syscall_64.tbl#L11
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md
https://man7.org/linux/man-pages/man2/syscall.2.html#NOTES
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)