我正在努力在虚拟机上构建新的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]
和内核空间使用[entry point]
来运行。这一栏([name]
)的原因是什么?
感谢您的观点和回答。抱歉我的英语不好。
答案 0 :(得分:2)
对于要交互的不同二进制文件,他们需要就一组接口达成一致,例如: struct
的类型和布局(填充)的大小。在amd64上,GNU / Linux原生支持三种ABI:
int
,long
和指针),但有amd64好东西:例如:寄存器是64位的,它们比i386中的更多。使用abi = x32 二进制文件的ABI在编译时配置(-m32
,-m64
和-mx32
分别用于GCC),但内核在所有三种情况下都以长模式运行, sometimes conversions are necessary以解释ABI差异。
关于你的问题:
[number]
:大小取决于系统调用约定。例如使用int 80h
,系统调用号将通过32位宽的eax传递。[abi]
:" common"系统调用可以用于两个amd64 ABI,但是有些(如指向struct
的指针需要特殊处理来解释ABI差异。[name]
:Linux提供带有系统电话号码定义的标头,例如:
#define __NR_exit 1
。宏名称是从[name]
列生成的。见this answer for more information。