系统调用中常用 abi 的用途是什么 table

what is use of common abi in system call table

我添加了一个简单的系统调用,它使用 printk 打印 hello world。为此,我将以下行添加到 syscall_64.tbl

434     common  hello                   __x64_sys_hello

写了一个简单的应用程序,从用户space

调用系统调用
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/syscall.h>
#include <string.h>
int main(void)
{
    long return_value = syscall(434);

    printf("return value from syscall: %ld\n", return_value);
    return 0;
}

有效,dmesg 添加了 "Hello World" 字符串

当我通过添加“-m32”标志生成 32 位应用程序时,它失败并显示 -ENOSYS

syscall_0x1b2(0x5663bfd0, 0xffb09a8c, 0x5663a5a4, 0x1, 0xffb09a84, 0xffb09a8c) = -1 (errno 38)

系统调用table第二列的"common"字段有什么用。我们是否需要在 32 位系统调用中再次声明 table 以供 32 位应用程序访问?

除了本机 x86-64 ABI 之外,64 位 x86 内核还可以支持两个 32 位 ABI。 32 位 ABI 是:

  1. 模拟 32 位 x86 内核实现的 ABI 的 i386 ABI。
  2. x32 ABI,它是用于 x86-64 内核的较新的 32 位 ABI。

GCC -m32 标志将为 i386 ABI 生成代码。使用 -mx32 标志为 x32 ABI 生成代码。

"syscall_64.tbl" 文件列举了 x86-64 和 x32 ABI 的系统调用:

  1. “64”条目用于 x64-64 ABI。
  2. "x32" 条目用于 x32 ABI。
  3. "common" 条目适用于 x64-64 和 x32 ABI。

"syscall_32.tbl" 列举了 i386 ABI 的系统调用。对于每个系统调用号,table 列出两个入口点:

  1. 32 位 x86 内核的入口点。
  2. x86-64 内核上 i386 ABI 仿真的 "compat" 入口点。

一些内核不再实现的过时系统调用在没有入口点的情况下列出。

虽然有很多旧的、仅 32 位二进制软件在 32 位和 64 位系统上使用 i386 ABI 和 运行s,但较新的 x32 ABI 从未变得非常受欢迎的。使用 x32 ABI 的应用程序不会 运行 在具有 32 位内核的系统上。