关于系统调用号和系统调用表

关于系统调用号和系统调用表
  

  1、首先每个体系结构的系统调用编号都不同,例如:

   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   






posted @ 2023-04-03 19:02  jinzi  阅读(262)  评论(0编辑  收藏  举报