Menu
CoddyTech

什么是系统调用?

本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 31 课,共 45 课。

你已经编写了 mov 和 lea 这样的汇编指令。这些指令直接在 CPU 上运行。但如果你需要执行 CPU 无法独自完成的操作,比如在屏幕上打印内容、从键盘读取内容或退出程序,该怎么办?

完成这些任务,你需要使用操作系统(本课程使用 Linux)。

什么是系统调用?

syscall(系统调用)是程序向操作系统发出的请求。你可以通过它请求操作系统帮你做一些事情。

为什么需要系统调用:

任务CPU 能单独完成吗?需要系统调用吗?
将两个数字相加可以不需要
在寄存器之间移动数据可以不需要
向屏幕打印文本不可以需要
读取键盘输入不可以需要
退出程序不可以需要
打开文件不可以需要

系统调用的工作原理:

  1. 将系统调用编号放入 rax(告诉操作系统你要做什么)
  2. 将参数放入其他寄存器(rdi、rsi、rdx 等)
  3. 执行 syscall 指令
  1. CPU 跳转到 OS 内核
  2. OS 执行请求
  3. OS 将控制权交还给你的程序

类比:

把系统调用想象成联系政府办事处:

步骤类比在汇编中
1决定你需要什么服务选择系统调用编号(放入 rax)
2填写表格将参数放入寄存器
3提交请求执行 syscall
4政府处理请求操作系统内核执行工作
5获取返回的结果程序继续运行

本课程将学习的系统调用:

系统调用编号功能章
exit60结束程序第 4 章
write1在屏幕上打印文本第 5 章

目前最重要的系统调用:exit

如果没有 exit,你的程序就会一直运行下去,或者崩溃。你编写的每个程序都必须以 exit 系统调用结束。

mov rax, 60    ; exit 的系统调用号
mov rdi, 0     ; 退出码(0 = 成功)
syscall        ; 请求操作系统退出

亲手试试

这节课没有代码挑战。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器