构建linux内核

时间:2018-03-29 13:40:16

标签: linux linux-kernel kernel system-calls kernel-module

我正在努力在虚拟机上构建新的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]和内核空间使用[entry point]来运行。这一栏([name])的原因是什么?

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

1 个答案:

答案 0 :(得分:2)

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

  • i386:与x86 32位二进制文​​件兼容。系统调用在syscall_32.tbl
  • 中定义
  • x86_64:原生的64位二进制文​​件。使用abi = 64
  • 定义系统调用syscall_64.tbl
  • x32:ILP32(32位intlong和指针),但有amd64好东西:例如:寄存器是64位的,它们比i386中的更多。使用abi = x32
  • 定义系统调用syscall_64.tbl

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

关于你的问题:

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