系统调用表中通用abi的用法

问题描述 投票:1回答:1

我添加了一个简单的系统调用,该调用使用printk打印问候世界。为此,我将以下行添加到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个回答
0
投票

除了本机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的系统调用。对于每个系统呼叫号码,该表列出了两个入口点:

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

列出了一些不再由内核实现的过时系统调用,但没有入口点。

尽管有许多使用i386 ABI并在32位和64位系统上运行的旧的仅32位二进制文​​件的旧软件,但较新的x32 ABI从未变得很流行。使用x32 ABI的应用程序无法在具有32位内核的系统上运行。

© www.soinside.com 2019 - 2024. All rights reserved.