咨询macOS 64位系统调用表及sys_write等操作的调用编号
macOS x86_64 下 sys_write 对应的系统调用编号及注意事项
这是个典型的跨平台系统调用踩坑点——Linux和macOS的内核实现完全独立,它们的系统调用编号、甚至部分调用约定都不一样,直接拿Linux的编号用肯定会出问题(Bus Error就是最常见的结果之一)。
核心答案:sys_write 在 macOS x86_64 下的编号
在x86_64架构的macOS上,sys_write对应的系统调用编号是4,你可以直接用头文件里定义的宏SYS_write来代替硬编码数字,这样更可靠,也能避免记错编号的问题。
怎么自己验证/查找其他系统调用编号?
你不需要死记硬背,macOS提供了标准的头文件和工具来查询:
- 查看
sys/syscall.h头文件,里面定义了所有系统调用的宏:
输出大概是grep SYS_write /usr/include/sys/syscall.h#define SYS_write 4。 - 也可以通过
man syscalls命令查看系统调用的详细文档(如果提示找不到,需要先安装Xcode开发者工具)。
为什么会触发Bus Error?
除了编号不对,还有几个常见原因:
- 参数传递不符合macOS的系统调用约定:x86_64 macOS下,系统调用编号存在
rax,参数依次存在rdi、rsi、rdx、r10、r8、r9,和Linux的System V ABI基本一致,但如果参数类型/地址无效(比如传递了未初始化的指针),就会触发Bus Error。 - 内存权限问题:比如尝试写入只读内存区域,或者访问不属于当前进程的内存空间。
简单示例(x86_64 macOS 汇编)
这里给个用sys_write输出字符串的小例子,确保调用流程正确:
.global _main _main: ; sys_write(fd=1, buf=hello, count=13) mov $SYS_write, %rax ; 用宏更安全,等价于mov $4, %rax mov $1, %rdi ; stdout的文件描述符是1 lea hello(%rip), %rsi ; 字符串的地址 mov $13, %rdx ; "Hello, World!\n"的长度 syscall ; sys_exit(0) mov $SYS_exit, %rax xor %rdi, %rdi syscall hello: .asciz "Hello, World!\n"
内容的提问来源于stack exchange,提问作者Bennett
相关产品推荐
相关产品推荐

