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

时间:2014-08-21 16:14:23

标签: arm system-calls arm64

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

1 个答案:

答案 0 :(得分:7)

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

要提供汇编代码段,这是来自Android Bionic's libc implementationwrite系统调用。 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/unistd.h中的数字。

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

另一个例子:

如果您手头有asld,则可以使用退出值创建一个简单的可执行文件。

此处42是我们的返回值,93exit system call

$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