我添加了一个简单的系统调用,该调用使用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位应用程序可以访问?
除了本机x86-64 ABI之外,64位x86内核还可以支持两个32位ABI。 32位ABI为:
GCC -m32
标志将为i386 ABI生成代码。使用-mx32
标志为x32 ABI生成代码。
“ syscall_64.tbl”文件列举了x86-64和x32 ABI的系统调用:
“ syscall_32.tbl”列举了i386 ABI的系统调用。对于每个系统呼叫号码,该表列出了两个入口点:
列出了一些不再由内核实现的过时系统调用,但没有入口点。
尽管有许多使用i386 ABI并在32位和64位系统上运行的旧的仅32位二进制文件的旧软件,但较新的x32 ABI从未变得很流行。使用x32 ABI的应用程序无法在具有32位内核的系统上运行。