首页 > 解决方案 > 为什么 MacOS 使用绝对内存位置进行系统调用?

问题描述

我在 Assembly 中看到了Hello World程序的示例,一个在 MacOS 中,另一个在 Linux 中。但它们之间的区别在于 MacOS 使用绝对内存位置进行系统调用,而 Linux 没有。这是为什么?为什么 MacOS 不能只使用1或内核用于系统调用的任何数字write

; MacOS
mov       rax, 0x02000004         ; system call for write
; Linux
mov       rax, 1                  ; system call for write

标签: assemblyx86-64system-calls

解决方案


为什么你认为它是一个绝对的内存位置?syscall 编号在syscalls.master中定义,编号为write4

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

但是,您还需要向它添加一些幻数,因为系统调用被分组到分区中

#define SYSCALL_CLASS_NONE  0   /* Invalid */
#define SYSCALL_CLASS_MACH  1   /* Mach */  
#define SYSCALL_CLASS_UNIX  2   /* Unix/BSD */
#define SYSCALL_CLASS_MDEP  3   /* Machine-dependent */
#define SYSCALL_CLASS_DIAG  4   /* Diagnostics */

writeUnix/BSD的数字是 2,所以数字(SYSCALL_CLASS_UNIX << 24) + 4等于 0x02000004


推荐阅读