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

构建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]:此列的范围值是多少。我发现这些数字是并

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

我知道file
syscall\u 32.tbl
有5个参数
[number][abi][name],[entry point],[compat entry point]
,file
syscall\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
      long
      和指针),但具有amd64优点:例如,寄存器是64位的,并且比i386中的寄存器多。系统调用是用abi=x32定义的
    二进制文件的ABI是在编译时配置的(
    -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]
    列生成的。看