系统调用中常用 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 是:
- 模拟 32 位 x86 内核实现的 ABI 的 i386 ABI。
- x32 ABI,它是用于 x86-64 内核的较新的 32 位 ABI。
GCC -m32
标志将为 i386 ABI 生成代码。使用 -mx32
标志为 x32 ABI 生成代码。
"syscall_64.tbl" 文件列举了 x86-64 和 x32 ABI 的系统调用:
- “64”条目用于 x64-64 ABI。
- "x32" 条目用于 x32 ABI。
- "common" 条目适用于 x64-64 和 x32 ABI。
"syscall_32.tbl" 列举了 i386 ABI 的系统调用。对于每个系统调用号,table 列出两个入口点:
- 32 位 x86 内核的入口点。
- x86-64 内核上 i386 ABI 仿真的 "compat" 入口点。
一些内核不再实现的过时系统调用在没有入口点的情况下列出。
虽然有很多旧的、仅 32 位二进制软件在 32 位和 64 位系统上使用 i386 ABI 和 运行s,但较新的 x32 ABI 从未变得非常受欢迎的。使用 x32 ABI 的应用程序不会 运行 在具有 32 位内核的系统上。
我添加了一个简单的系统调用,它使用 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 是:
- 模拟 32 位 x86 内核实现的 ABI 的 i386 ABI。
- x32 ABI,它是用于 x86-64 内核的较新的 32 位 ABI。
GCC -m32
标志将为 i386 ABI 生成代码。使用 -mx32
标志为 x32 ABI 生成代码。
"syscall_64.tbl" 文件列举了 x86-64 和 x32 ABI 的系统调用:
- “64”条目用于 x64-64 ABI。
- "x32" 条目用于 x32 ABI。
- "common" 条目适用于 x64-64 和 x32 ABI。
"syscall_32.tbl" 列举了 i386 ABI 的系统调用。对于每个系统调用号,table 列出两个入口点:
- 32 位 x86 内核的入口点。
- x86-64 内核上 i386 ABI 仿真的 "compat" 入口点。
一些内核不再实现的过时系统调用在没有入口点的情况下列出。
虽然有很多旧的、仅 32 位二进制软件在 32 位和 64 位系统上使用 i386 ABI 和 运行s,但较新的 x32 ABI 从未变得非常受欢迎的。使用 x32 ABI 的应用程序不会 运行 在具有 32 位内核的系统上。