我找到了适用于Linux ARM32和许多其他体系结构的syscall表,但问题仍然存在。 syscall表正好适合ARM64?
#1 楼
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是新的,并且使用了更新的,更不可知的Arch不可知机制,而旧版本却永远不会破坏用户空间兼容性,因此无法更新为新机制。以下是在QEMU上运行并使用
64
用于write
和93
用于exit
的最小限度可运行aarch64汇编Linux调用示例: br /> .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
在Ubuntu 16.04 amd64上进行了测试。 / questions / 421750 / where-do-you-you-find-the-syscall-table-for-linux / 499016#499016
也证实了我所说的关于似乎具有统一调用功能的新型拱门的说法数字。
#2 楼
更新:有关在哪里找到ARM64 syscall定义的最新信息,请参见此答案。请注意,下面的信息可能只是为了向后兼容。请参阅
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
中的一些特定于AArch64的系统调用。
评论
我认为arm64真正有趣的文件是include / uapi / asm-generic / unistd.h:reverseengineering.stackexchange.com/a/18834/12321
– Ciro Santilli郝海东冠状病六四事件法轮功
18年7月18日在9:01
@CiroSantilli新疆改造中心六四事件法轮功:恩-我想知道我链接的文件现在使用了什么?也许glibc版本与它有关……无论如何,根据实验结果,asm通用文件可能是正确的。
–tonysdg
18年7月18日在15:39