gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:09:42 29 4
gpt4 key购买 nike

我正在练习在虚拟机上构建一个新的 Linux 内核。我对 2 个文件 syscall_32.tblsyscall_64.tbl 中的模块的步骤导入参数有一些疑问。

我知道文件 syscall_32.tbl 有 5 个参数 [number] [abi] [name], [entry point], [compat entry point],和文件 syscall_64.tbl 有 4 个没有 [compat 入口点]

我有一些问题找不到答案。

  1. [number]:该列的范围值是多少。我发现这些数字是并集和递增序列。如果现在我导入新的大数字(比如 10^6),可以吗?

  2. [abi]:我知道在文件 syscall_64.tbl 中,列的值可能是 common 64x32。每个值的含义是什么?他们之间为什么不同?为什么机器 64 位在此列中具有值 x32

  3. [name]:我知道 [entry point][compat entry point] 用于函数运行系统调用。而当用户调用系统调用时,我们不需要调用name,我们只使用[number],内核空间使用[entry point]运行。此列 ([name]) 的原因是什么?

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

最佳答案

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

  • i386 :为了与 x86 32 位二进制文​​件兼容。系统调用在 syscall_32.tbl 中定义
  • x86_64 : native 64 位二进制文​​件。系统调用定义syscall_64.tbl abi=64
  • x32 :ILP32(32 位 intlong 和指针),但带有 amd64 优点:例如寄存器是 64 位的,比 i386 中的要多。系统调用定义syscall_64.tbl使用 abi=x32

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

关于您的问题:

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

关于linux - 构建 linux 内核时文件 syscall_32.tbl、syscall_64.tbl 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49557623/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com