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

Posted

技术标签:

【中文标题】如何在ARM64中实现系统调用?【英文标题】:How to implement system call in ARM64? 【发布时间】:2014-10-15 08:49:52 【问题描述】:

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

【问题讨论】:

这取决于您使用的操作系统。你在为哪一个写代码? 我在 amd64 linux 上,我正在为 aarch64 linux 写作。 这篇博客解释了ARM64系统调用的完整流程。可能对你有用。 http://eastrivervillage.com/Anatomy-of-Linux-system-call-in-ARM64/ 这是系统调用号表所在的位置:reverseengineering.stackexchange.com/questions/16917/… 【参考方案1】:

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

给一个汇编器 sn-p,这是来自android Bionic's libc implementation 的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是我们的返回值,93exitsystem 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

【讨论】:

你能不能也给出带有系统调用号的系统调用列表? @in3o 添加了一些额外内容。 你能澄清一下你在说什么类型的新一代架构吗? x86_64 有不同的系统调用列表。 "arc, arm64, c6x, hexagon, metag, openrisc, score, tile, unicore32" 参考:lkml.org/lkml/2014/2/3/248

以上是关于如何在ARM64中实现系统调用?的主要内容,如果未能解决你的问题,请参考以下文章

linux arch/arm64 添加系统调用

如何在spring代理中实现自我调用(self-invocation)

如何在spring代理中实现自我调用(self-invocation)

如何在 Java 中实现同步方法超时?

在 Java 中实现“系统”命令

Android中实现系统声音录制(内置声源的录制)-音频通道及framework调用流程分析