代码之家  ›  专栏  ›  技术社区  ›  md.jamal

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

  •  0
  • md.jamal  · 技术社区  · 4 年前

    我添加了一个简单的系统调用,它使用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位应用程序可以访问吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Ian Abbott    4 年前

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

    1. 这个 i386 模拟32位x86内核实现的ABI的ABI。
    2. 这个 x32 ABI是一种新的32位ABI,适用于x86-64内核。

    海湾合作委员会 -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”入口点。

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

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