构建linux内核中syscall_32.tbl、syscall_64.tbl文件的参数
我正在练习在虚拟机上构建一个新的linux内核。我对其中模块的step导入参数中的两个文件构建linux内核中syscall_32.tbl、syscall_64.tbl文件的参数,linux,linux-kernel,kernel,system-calls,kernel-module,Linux,Linux Kernel,Kernel,System Calls,Kernel Module,我正在练习在虚拟机上构建一个新的linux内核。我对其中模块的step导入参数中的两个文件syscall_32.tbl和syscall_64.tbl有一些疑问 我知道filesyscall\u 32.tbl有5个参数[number][abi][name],[entry point],[compat entry point],filesyscall\u 64.tbl有4个参数没有[compat entry point] 我有些问题找不到答案 [number]:此列的范围值是多少。我发现这些数字是并
syscall_32.tbl
和syscall_64.tbl
有一些疑问
我知道filesyscall\u 32.tbl
有5个参数[number][abi][name],[entry point],[compat entry point]
,filesyscall\u 64.tbl
有4个参数没有[compat entry point]
我有些问题找不到答案
[number]
:此列的范围值是多少。我发现这些数字是并集和递增序列。如果现在我导入新的大数字(如10^6),可以吗[abi]
:我知道在文件syscall_64.tbl
中,列的值可能是common
,64
,x32
。每个值的含义是什么?他们之间为什么不同?为什么64位机器在此列中有值x32
[name]
:我知道[entry point]
和[compat entry point]
用于运行系统调用的函数。当用户调用系统调用时,我们不需要调用名称
,我们只使用[number]
和内核空间使用[entry point]
来运行。出现此列([name]
)的原因是什么谢谢你的观点和回答。对不起,我的英语不好。要让不同的二进制文件进行交互,它们需要在一组接口上达成一致,例如
struct
s的类型大小和布局(填充)。在amd64上,GNU/Linux本机支持三种ABI:
- :与x86 32位二进制文件兼容。系统调用在中定义
- :本机64位二进制文件。系统调用定义为abi=64
- :ILP32(32位
,int
和指针),但具有amd64优点:例如,寄存器是64位的,并且比i386中的寄存器多。系统调用是用abi=x32定义的long
-m32
,-m64
和-mx32
分别用于GCC),但内核在所有三种情况下都以长模式运行,并考虑ABI差异
关于你的问题:
[number]
:大小取决于系统调用约定。e、 g.使用int 80h
,系统调用号通过32位宽的eax传递[abi]
:“通用”系统调用可用于两个amd64 abi,但有些调用,如带有指向结构的指针的调用,需要进行特殊处理,以说明abi的差异
[name]
:Linux提供了带有系统呼叫号码定义的标题,例如。
\define\uu NR\u exit 1
。宏名称是从[name]
列生成的。看