我想知道是否有一些适用于 Linux ARM64 架构的系统调用表?我找到了Linux ARM32和许多其他架构的syscall 表,但问题仍然存在。
有谁知道我在哪里可以找到 ARM64 的系统调用表?
我想知道是否有一些适用于 Linux ARM64 架构的系统调用表?我找到了Linux ARM32和许多其他架构的syscall 表,但问题仍然存在。
有谁知道我在哪里可以找到 ARM64 的系统调用表?
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.tbl
arm 32 位,但 arm64 文件有一条评论说:
新架构应该使用这个文件并在用户空间中实现功能较少的调用。
所以我猜这只是因为 aarch64 是新的并且使用了更新的更不可知的机制,而旧的永远不会破坏用户空间兼容性,因此无法更新到新机制。
以下最小可运行 aarch64 程序集 Linux 调用示例证实了这一点,该示例适用于 QEMU 并使用64
forwrite
和93
for 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
组装并运行:
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)
...