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

10

我正在处理arm64汇编编程,并希望使用svc指令实现系统调用。我在网上找不到任何可用的arm64系统调用实现,也找不到arm64系统调用列表。请解释一下实现方法。


这取决于您使用的操作系统。您正在为哪个操作系统编写代码? - jtlim
我正在使用amd64 Linux系统,并且正在为aarch64 Linux系统编写代码。 - in3o
这篇博客详细解释了ARM64系统调用的完整流程。对您可能会有所帮助。 http://eastrivervillage.com/Anatomy-of-Linux-system-call-in-ARM64/ - theB
这是系统调用号码表所在的位置:https://reverseengineering.stackexchange.com/questions/16917/arm64-syscalls-table/18834#18834 - Ciro Santilli OurBigBook.com
1个回答

11

你可以在x0x5中传递六个参数,返回值保存在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/unistd.h的数字。

您还可以查看arch/arm64/include/asm/syscall.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

你能否提供系统调用及其对应的系统调用号码列表? - in3o
@in3o 添加了一些额外的东西。 - auselen
请问您所说的新一代架构是指哪种类型?x86_64有不同的系统调用列表。 - in3o
1
"arc, arm64, c6x, hexagon, metag, openrisc, score, tile, unicore32". 参考:https://lkml.org/lkml/2014/2/3/248 - auselen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接