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

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

【问题讨论】:

标签: arm system-calls arm64


【解决方案1】:

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

给一个汇编器 sn-p,这是来自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是我们的返回值,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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2012-09-28
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2016-01-18
  • 2012-08-22
相关资源
最近更新 更多