assembly - 为什么 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
解决方案
为什么你认为它是一个绝对的内存位置?syscall 编号在syscalls.master中定义,编号为write
4
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 */
write
Unix/BSD的数字是 2,所以数字(SYSCALL_CLASS_UNIX << 24) + 4
等于 0x02000004
推荐阅读
- android - 无法在 Android 上启动项目:运行 adb 时出错
- model-view-controller - rails中的未知格式文本/ html
- python - 为什么我的代码仅从 PDF 的最后一页创建 jpeg,因此仅将最后一页写入文本文件?
- ffmpeg - 如何在不对视频应用图像蒙版的情况下创建圆形视频(视频顶部的透明区域)效果
- c# - 创建 callbackUrl asp.net 核心时出错
- node.js - req.body 尝试解析两次时未定义(参见代码)
- django - 获取登录用户,同时在 Django 中使用 UpdateView 更新模型用户
- apache-kafka - Kafka Streams > KTable 加入问题
- ios - 为什么 iOS 会显示警告“此应用程序需要由开发人员更新才能在此版本的 iOS 上运行”。对于我的反应原生应用程序?
- mysql - 规范化现有数据;varchar 列表到整数