构建 linux 内核中文件 syscall_32.tbl、syscall_64.tbl 的参数

Parameters of files syscall_32.tbl, syscall_64.tbl in build linux kernel

我正在练习在虚拟机上构建一个新的 linux 内核。我对 2 个文件 syscall_32.tblsyscall_64.tbl 在其中一个模块的步骤导入参数中有一些疑问。

我知道文件 syscall_32.tbl 有 5 个参数 [number] [abi] [name], [entry point], [compat entry point],文件 syscall_64.tbl 有 4 个没有 [compat entry point]

我有一些问题找不到答案。

  1. [number]:该列的范围值是多少。我发现这些数字是并集和递增序列。如果现在我导入新的大数(比如10^6)可以吗?

  2. [abi]:我知道在文件syscall_64.tbl中,列的值可能是common64x32。每个值的含义是什么?他们之间为什么不同?为什么 64 位机器在此列中具有值 x32

  3. [name]:我知道 [entry point][compat entry point] 用于 运行 系统调用的功能。而当用户调用系统调用时,我们不需要调用name,我们只使用[number]和内核space使用[entry point]到运行。此列 ([name]) 的原因是什么?

感谢您的观点和回答。抱歉我的英语不好。

要让不同的二进制文件进行交互,它们需要就一组接口达成一致,例如structs 的类型和布局(填充)的大小。在 amd64 上,GNU/Linux 原生支持三个 ABI:

  • i386: For compatibility with x86 32-bit binaries. System calls are defined in syscall_32.tbl
  • x86_64: Native 64-bit binaries. System calls are defined syscall_64.tbl 和 abi=64
  • x32: ILP32 (32-bit int, long and pointers), but with amd64 goodies: e.g. registers are 64-bit and there is more of them than in i386. System calls are defined syscall_64.tbl 与 abi=x32

二进制文件的 ABI 在编译时配置(GCC 分别为 -m32-m64-mx32),但内核在所有三种情况下都以长模式运行,并且 sometimes conversions are necessary 以解释 ABI 差异。

关于您的问题:

  1. [number]:大小取决于系统调用约定。例如用int 80h,系统调用号通过32位宽的eax传递。
  2. [abi]:"common" 系统调用可用于两个 amd64 ABI,但有些系统调用,如那些带有指向 structs 的指针,需要特殊处理以解决 ABI 差异。
  3. [name]: Linux 提供 headers 系统调用号码定义,例如 #define __NR_exit 1。宏名称是从 [name] 列生成的。参见 this answer for more information