【问题标题】:what is use of common abi in system call table系统调用表中常见的abi有什么用
【发布时间】:2020-01-18 06:22:19
【问题描述】:

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

434     common  hello                   __x64_sys_hello

写了一个简单的应用,从用户空间调用系统调用

#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)

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

【问题讨论】:

    标签: c linux linux-kernel linux-device-driver system-calls


    【解决方案1】:

    除了原生 x86-64 ABI 之外,还有两个 32 位 ABI 可以被 64 位 x86 内核支持。 32 位 ABI 是:

    1. i386 ABI 模拟由 32 位 x86 内核实现的 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. “通用”条目适用于 x64-64 和 x32 ABI。

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

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

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

    虽然有很多旧的 32 位纯二进制软件使用 i386 ABI 并在 32 位和 64 位系统上运行,但较新的 x32 ABI 从未变得非常流行。使用 x32 ABI 的应用程序无法在 32 位内核的系统上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2016-03-16
      • 2012-01-08
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多