macOS 64位系统调用表

时间:2018-02-17 20:34:54

标签: macos assembly x86-64 system-calls

我可以找到一个Linux 64位系统调用表,但是电话号码在macOS上不起作用 - 每当我尝试使用它时,我都会得到Bus Error: 10

sys_write等操作的macOS电话号码是什么?

3 个答案:

答案 0 :(得分:2)

您可以在(/usr/include/)sys/syscall.h中从用户模式获取系统调用号码列表。这些数字与Linux中的数字不同。在从bsd / kern / syscalls / syscalls.master构建XNU期间自动生成该文件。

如果使用libsystem_kernel系统调用导出,则可以按原样使用这些数字。如果你使用汇编,你必须添加0x2000000来为BSD层标记它们(而不是0x1000000,这意味着Mach陷阱,或者0x3000000,这意味着机器依赖)。

要查看程序集中系统调用的示例,您可以轻松地反汇编导出的包装器:x86_64的/usr/lib/system/libsystem_kernel.dylib(或ARM64使用共享库缓存中的jtool)。

答案 1 :(得分:1)

您需要使用0x2000000文件将syscalls.master添加到电话号码。我正在使用the XNU bds/kern/syscalls.master file。这是我要调用的syscalls.master文件中的一个函数:

4   AUE_NULL    ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); } 

就哪个寄存器传递参数而言,它与64位Linux相同。参数分别通过rdirsirdxr10r8r9寄存器传递。 write函数有三个参数,在以下程序集中描述:

mov rax, 0x2000004     ; sys_write call identifier
mov rdi, 1             ; STDOUT file descriptor
mov rsi, myMessage     ; buffer to print
mov rdx, myMessageLen  ; length of buffer
syscall                ; make the system call

答案 2 :(得分:1)

正如已经指出的那样,您需要在呼叫号码中添加 0x2000000 。神奇数字的解释来自 osfmk / mach / i386 / syscall_sw.h 中的xnu内核。

OSX上有一些系统调用。所有系统调用均通过 syscall 指令进入内核。那时有Mach系统调用,BSD系统调用,NONE,诊断和机器相关。每个系统调用都标记有一个类枚举,该类枚举左移24位,即 SYSCALL_CLASS_SHIFT 。 BSD系统调用的枚举为2, SYSCALL_CLASS_UNIX 。因此,魔术数字 0x2000000 的构造如下:

hex(2<<24)
'0x2000000'

显然,您可以从内核来源获得该魔术数字,但不能从开发人员的包含文件获得该魔术数字。我认为这意味着Apple确实希望您链接到可解决您的系统调用Shim的库对象文件,而不是使用内联例程:对象兼容性而不是源代码兼容性。

在x86_64上,系统调用本身与Linux一样使用System V ABI(第A.2.1节),并且使用syscall指令。参数在rdi,rsi,rdx,r10,r8和r9中传递。系统调用号在rax寄存器中。