如何在ARM64中实现系统调用?

in3*_*n3o 8 arm system-calls arm64

我正在使用arm64汇编编码,我想使用svc指令实现系统调用.我在网上找不到任何有效的arm64系统调用实现.另外,我找不到arm64的系统调用列表.还解释了实施.

aus*_*len 7

您可以通过六个参数在x0x5,返回值被保存在x0.

为了给出汇编代码片段,这是write来自Android Bionic的libc实现的系统调用.write三个论点已经存在了x0-x2.传入Syscall号码x8.

/* Generated by gensyscalls.py. Do not edit. */

#include <private/bionic_asm.h>

    .hidden __set_errno

ENTRY(write)
    mov     x8, __NR_write
    svc     #0

    cmn     x0, #(MAX_ERRNO + 1)
    cneg    x0, x0, hi
    b.hi    __set_errno

    ret
END(write)
Run Code Online (Sandbox Code Playgroud)

AArch64 ABI看一看.

新一代架构都使用include/uapi/asm-generic/unistd.h中的数字.

您还可以检查arch/arm64/include/asm/syscall.h以获取参数和返回值处理.

另一个例子:

如果您拥有as并且ld手头,您可以使用退出值创建一个简单的可执行文件.

42是我们的返回值,93exit 系统调用.

$cat answer.s
 .global _start
 _start:
 mov x0, #42
 mov x8, #93
 svc #0
$as answer.s -o answer.o
$ld answer.o -o answer
$./answer
$echo $?
42
Run Code Online (Sandbox Code Playgroud)