什么是系统调用?
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 31 课,共 45 课。
你已经编写了 mov 和 lea 这样的汇编指令。这些指令直接在 CPU 上运行。但如果你需要执行 CPU 无法独自完成的操作,比如在屏幕上打印内容、从键盘读取内容或退出程序,该怎么办?
完成这些任务,你需要使用操作系统(本课程使用 Linux)。
什么是系统调用?
syscall(系统调用)是程序向操作系统发出的请求。你可以通过它请求操作系统帮你做一些事情。
为什么需要系统调用:
| 任务 | CPU 能单独完成吗? | 需要系统调用吗? |
|---|---|---|
| 将两个数字相加 | 可以 | 不需要 |
| 在寄存器之间移动数据 | 可以 | 不需要 |
| 向屏幕打印文本 | 不可以 | 需要 |
| 读取键盘输入 | 不可以 | 需要 |
| 退出程序 | 不可以 | 需要 |
| 打开文件 | 不可以 | 需要 |
系统调用的工作原理:
- 将系统调用编号放入
rax(告诉操作系统你要做什么) - 将参数放入其他寄存器(
rdi、rsi、rdx等) - 执行
syscall指令
- CPU 跳转到 OS 内核
- OS 执行请求
- OS 将控制权交还给你的程序
类比:
把系统调用想象成联系政府办事处:
| 步骤 | 类比 | 在汇编中 |
|---|---|---|
| 1 | 决定你需要什么服务 | 选择系统调用编号(放入 rax) |
| 2 | 填写表格 | 将参数放入寄存器 |
| 3 | 提交请求 | 执行 syscall |
| 4 | 政府处理请求 | 操作系统内核执行工作 |
| 5 | 获取返回的结果 | 程序继续运行 |
本课程将学习的系统调用:
| 系统调用 | 编号 | 功能 | 章 |
|---|---|---|---|
exit | 60 | 结束程序 | 第 4 章 |
write | 1 | 在屏幕上打印文本 | 第 5 章 |
目前最重要的系统调用:exit
如果没有 exit,你的程序就会一直运行下去,或者崩溃。你编写的每个程序都必须以 exit 系统调用结束。
mov rax, 60 ; exit 的系统调用号
mov rdi, 0 ; 退出码(0 = 成功)
syscall ; 请求操作系统退出亲手试试
这节课没有代码挑战。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器