You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:56:45