构建 linux 内核中文件 syscall_32.tbl、syscall_64.tbl 的参数
Parameters of files syscall_32.tbl, syscall_64.tbl in build linux kernel
我正在练习在虚拟机上构建一个新的 linux 内核。我对 2 个文件 syscall_32.tbl
和 syscall_64.tbl
在其中一个模块的步骤导入参数中有一些疑问。
我知道文件 syscall_32.tbl
有 5 个参数 [number] [abi] [name], [entry point], [compat entry point]
,文件 syscall_64.tbl
有 4 个没有 [compat entry point]
。
我有一些问题找不到答案。
[number]
:该列的范围值是多少。我发现这些数字是并集和递增序列。如果现在我导入新的大数(比如10^6)可以吗?
[abi]
:我知道在文件syscall_64.tbl
中,列的值可能是common
、64
、x32
。每个值的含义是什么?他们之间为什么不同?为什么 64 位机器在此列中具有值 x32
?
[name]
:我知道 [entry point]
和 [compat entry point]
用于 运行 系统调用的功能。而当用户调用系统调用时,我们不需要调用name
,我们只使用[number]
和内核space使用[entry point]
到运行。此列 ([name]
) 的原因是什么?
感谢您的观点和回答。抱歉我的英语不好。
要让不同的二进制文件进行交互,它们需要就一组接口达成一致,例如struct
s 的类型和布局(填充)的大小。在 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 差异。
关于您的问题:
[number]
:大小取决于系统调用约定。例如用int 80h
,系统调用号通过32位宽的eax传递。
[abi]
:"common" 系统调用可用于两个 amd64 ABI,但有些系统调用,如那些带有指向 struct
s 的指针,需要特殊处理以解决 ABI 差异。
[name]
: Linux 提供 headers 系统调用号码定义,例如
#define __NR_exit 1
。宏名称是从 [name]
列生成的。参见 this answer for more information。
我正在练习在虚拟机上构建一个新的 linux 内核。我对 2 个文件 syscall_32.tbl
和 syscall_64.tbl
在其中一个模块的步骤导入参数中有一些疑问。
我知道文件 syscall_32.tbl
有 5 个参数 [number] [abi] [name], [entry point], [compat entry point]
,文件 syscall_64.tbl
有 4 个没有 [compat entry point]
。
我有一些问题找不到答案。
[number]
:该列的范围值是多少。我发现这些数字是并集和递增序列。如果现在我导入新的大数(比如10^6)可以吗?[abi]
:我知道在文件syscall_64.tbl
中,列的值可能是common
、64
、x32
。每个值的含义是什么?他们之间为什么不同?为什么 64 位机器在此列中具有值x32
?[name]
:我知道[entry point]
和[compat entry point]
用于 运行 系统调用的功能。而当用户调用系统调用时,我们不需要调用name
,我们只使用[number]
和内核space使用[entry point]
到运行。此列 ([name]
) 的原因是什么?
感谢您的观点和回答。抱歉我的英语不好。
要让不同的二进制文件进行交互,它们需要就一组接口达成一致,例如struct
s 的类型和布局(填充)的大小。在 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 差异。
关于您的问题:
[number]
:大小取决于系统调用约定。例如用int 80h
,系统调用号通过32位宽的eax传递。[abi]
:"common" 系统调用可用于两个 amd64 ABI,但有些系统调用,如那些带有指向struct
s 的指针,需要特殊处理以解决 ABI 差异。[name]
: Linux 提供 headers 系统调用号码定义,例如#define __NR_exit 1
。宏名称是从[name]
列生成的。参见 this answer for more information。