ARM64 系统调用表

逆向工程 部件 linux 手臂 系统调用
2021-06-10 07:38:16

我想知道是否有一些适用于 Linux ARM64 架构的系统调用表?我找到了Linux ARM32和许多其他架构的syscall 表,但问题仍然存在。

有谁知道我在哪里可以找到 ARM64 的系统调用表?

2个回答

arm64 系统调用号定义在:https : //github.com/torvalds/linux/blob/v4.17/include/uapi/asm-generic/unistd.h

这有点令人困惑,因为它与 x86 和 x86_64 以及 arm 32 位完全不同,后者在 下定义系统调用号arch/,例如arch/arm/tools/syscall.tblarm 32 位,但 arm64 文件有一条评论说:

新架构应该使用这个文件并在用户空间中实现功能较少的调用。

所以我猜这只是因为 aarch64 是新的并且使用了更新的更不可知的机制,而旧的永远不会破坏用户空间兼容性,因此无法更新到新机制。

以下最小可运行 aarch64 程序集 Linux 调用示例证实了这一点,该示例适用于 QEMU 并使用64forwrite93for exit

电源

.text
.global _start
_start:
    /* write */
    mov x0, #1
    ldr x1, =msg
    ldr x2, =len
    mov x8, #64
    svc #0

    /* exit */
    mov x0, #0
    mov x8, #93
    svc #0
msg:
    .ascii "hello world\n"
len = . - msg

GitHub 上游

组装并运行:

aarch64-linux-gnu-as -o main.o main.S
aarch64-linux-gnu-ld -o main.out main.o
qemu-aarch64 main.out

在 Ubuntu 16.04 amd64 中测试。

strace 源代码

这是一个容易欺骗检查系统调用号的好地方,请参阅:https : //unix.stackexchange.com/questions/421750/where-do-you-find-the-syscall-table-for-linux/499016# 499016

这也证实了我所说的似乎具有统一电话号码的新拱门。

更新:有关在何处找到 ARM64 系统调用定义的最新信息,请参阅此答案请注意,以下信息可能仅用于向后兼容。


arch/arm64/include/asm/unistd32.h

 ...
 #define __NR_restart_syscall 0
 __SYSCALL(__NR_restart_syscall, sys_restart_syscall)
 #define __NR_exit 1
 __SYSCALL(__NR_exit, sys_exit)
 #define __NR_fork 2
 __SYSCALL(__NR_fork, sys_fork)
 #define __NR_read 3
 __SYSCALL(__NR_read, sys_read)
 #define __NR_write 4
 __SYSCALL(__NR_write, sys_write)
 #define __NR_open 5
 __SYSCALL(__NR_open, compat_sys_open)
 #define __NR_close 6
 __SYSCALL(__NR_close, sys_close)
            /* 7 was sys_waitpid */
 __SYSCALL(7, sys_ni_syscall)
 #define __NR_creat 8
 __SYSCALL(__NR_creat, sys_creat)
 ...

您还会在arch/arm64/include/asm/unistd.h.