Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
macOS 64位系统调用表_Macos_Assembly_X86 64_System Calls - Fatal编程技术网

macOS 64位系统调用表

macOS 64位系统调用表,macos,assembly,x86-64,system-calls,Macos,Assembly,X86 64,System Calls,我可以找到一个Linux 64位系统调用表,但调用号码在macOS上不起作用-每当我尝试使用它们时,就会出现总线错误:10 对于诸如sys\u write之类的操作,macOS呼叫号码是多少?您需要使用syscalls.master文件将0x2000000添加到呼叫号码中。我正在使用。下面是我要调用的syscalls.master文件中的一个函数: 4 AUE_NULL ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_si

我可以找到一个Linux 64位系统调用表,但调用号码在macOS上不起作用-每当我尝试使用它们时,就会出现
总线错误:10


对于诸如
sys\u write
之类的操作,macOS呼叫号码是多少?

您需要使用
syscalls.master
文件将
0x2000000
添加到呼叫号码中。我正在使用。下面是我要调用的
syscalls.master
文件中的一个函数:

4   AUE_NULL    ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); } 
在向哪个寄存器传递参数方面,它与64位Linux相同。参数分别通过
rdi
rsi
rdx
r10
r8
r9
寄存器传递。
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

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

如果使用libsystem\u内核系统调用导出,则可以按原样使用这些数字。如果使用assembly,则必须添加0x2000000以标记BSD层(而不是0x1000000,表示马赫陷阱,或0x3000000,表示机器相关)


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

如前所述,您需要向调用号添加0x2000000。这个神奇数字的解释来自(search
SYSCALL\u CLASS\u SHIFT
)中的xnu内核源代码

/*
*64位系统调用项的Syscall类。
*对于64位用户,32位系统调用号是分区的
*高阶位表示类,低阶位表示类
*位是该类中的系统调用号。
*64位系统调用号的高位32位未使用。
*所有系统类都通过syscall指令进入内核。
OSX上有很多类的系统调用。所有系统调用都通过syscall指令进入内核。此时有马赫系统调用、BSD系统调用、无、诊断和机器相关

\define SYSCALL\u CLASS\u NONE 0/*无效*/
#定义系统调用\u类\u马赫数1/*马赫数*/
#定义SYSCALL\u CLASS\u UNIX 2/*UNIX/BSD*/
#定义系统调用\u类\u MDEP 3/*依赖于机器*/
#定义系统调用\u类\u诊断4/*诊断*/
每个系统调用都使用一个类枚举进行标记,该类枚举左移24位,即SYSCALL\u class\u SHIFT。BSD系统调用的枚举为2,SYSCALL\u CLASS\u UNIX。因此,幻数0x2000000被构造为:


//2请注意,这通常不起作用。有些电话号码相同,但大多数电话号码会有所不同。从Linux系统调用号推断OSX系统调用号是一个非常糟糕的想法。不要那样做@事实上,这很有趣。你知道macOS系统调用表吗?我不知道它是否准确,但我发现:你不使用Linux系统调用表。您想使用FreeBSD系统调用表。@Bennett通常,系统调用号记录在include文件
中。我不确定这个文件在OSX上的什么地方,但类似的东西应该在某个地方。这个答案给出了一个例子(使用NASM语法):@MichaelPetch idk。。。6个零在我的机器上工作,但7个失败。