如何在ARM64中实现系统调用



我正在使用arm64汇编编码,我想使用svc指令实现系统调用。我在网上找不到任何工作的arm64系统调用实现。另外,我找不到arm64的系统调用列表。

可以将x0中的6个参数传递给x5,返回值保存在x0

给出一个汇编代码片段,这是来自Android Bionic的libc实现的write系统调用。write的三个参数已经在x0-x2中了。系统调用号在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)

给AArch64 ABI看看。

新一代的架构都使用来自include/uapi/asm-generic/unist .h的编号。

你也可以检查arch/arm64/include/asm/sycall .h的参数和返回值处理。

另一个例子:

如果你有asld在手,你可以创建一个简单的可执行文件,只是退出和退出值。

这里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

最新更新