【问题标题】:Parameters of files syscall_32.tbl, syscall_64.tbl in build linux kernel构建linux内核中文件syscall_32.tbl、syscall_64.tbl的参数
【发布时间】:2018-09-08 12:04:45
【问题描述】:

我正在练习在虚拟机上构建一个新的 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])?

感谢您的意见和回答。对不起我的英语不好。

【问题讨论】:

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


    【解决方案1】:

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

    • i386:为了与 x86 32 位二进制文​​件兼容。系统调用定义在syscall_32.tbl
    • x86_64:本机 64 位二进制文​​件。系统调用定义为 syscall_64.tbl 与 abi=64
    • 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]:“通用”系统调用可用于两种 amd64 ABI,但有些,如指向 structs 的那些,需要特殊处理以解决 ABI 差异。
    3. [name]:Linux 提供带有系统调用号定义的标头,例如 #define __NR_exit 1。宏名称是从[name] 列生成的。见this answer for more information

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2015-07-09
      • 2021-08-19
      • 2018-12-15
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多