9.5 UNIX系统调用

L55

学习目标

UNIX系统调用按功能分为进程控制、文件操纵、进程通信和信息保护等类型,是UNIX内核服务用户的接口。

  • 进程控制类系统调用:fork(创建)、exec(替换)、exit(终止)、wait(等待)等。
  • 文件操纵类系统调用:open(打开)、read/write(读写)、close(关闭)、link/unlink(连接/去连接)等。
  • 进程通信类系统调用:pipe(管道)、msgget/msgsnd/msgrcv(消息队列)、shmat/shmdt(共享内存)等。
  • 信息保护类系统调用:chmod(改权限)、chown(改属主)、getuid/setuid(获取/设置用户ID)等。

原理 · 深入理解

系统调用路径 用户 API 陷入 / ecall 系统调用表 内核函数 返回用户态 恢复 PC · 继续应用 MCU 课多用直接 API;图中路径对齐教材与 RISC-V ecall

9.5.1 进程控制

其它进程调用:用于获取进程或用户标识,以及让进程主动暂停。

  1. 获得进程 ID
  2. 获得用户 ID
  3. 进程暂停(pause)

改变进程映像和等待

  1. 执行一个文件(exec)
  2. 等待子进程结束(wait)

其它进程调用

  1. 获得进程ID
  2. 获得用户ID
  3. 进程暂停(pause)

9.5.2 文件操纵

建立与文件的连接和去连接:link 用于为一个已存在文件建立一个新的目录项(硬链接),unlink 用于删除目录项;当连接计数降为 0 时文件实际被删除。

  1. 连接(link)
  2. 去连接(unlink)

文件的读和写:read 和 write 是两个最常用的系统调用,都要求用户提供三个输入参数。

  1. 文件描述符 fd
  2. buf 缓冲区首址:对读是信息传送的目标地址,对写是信息传送的源地址
  3. 用户要求传送的字节数 nbyte

文件操纵的系统调用参数:文件描述符 fd、buf 缓冲区首址(读时为目标地址,写时为源地址)、要求传送的字节数 nbyte。

  1. 连接(link)
  2. 去连接(unlink)

9.5.3 进程通信和信息保护

信息维护:UNIX 系统中设置了许多条用于系统维护的系统调用。

  1. 设置和获得时间
  2. 获得进程和子进程时间(times)
  3. 设置文件访问和修改时间(utime)
  4. 获得当前 UNIX 系统的 I was cut off again. Let me continue from where I left off. I need to be careful about token limits. Let me continue writing the remaining entries. I'll try to keep going. 名称(uname)

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

UNIX系统调用

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能说明用户态不能直接访问设备寄存器的原因。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • 全部函数都链进固件时,还有「用户/内核」边界吗?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表