https://xv6.dgs.zone/labs/requirements/lab2.html

阅读

在你开始写代码之前,请阅读xv6手册《book-riscv-rev1》的第2章、第4章的第4.3节和第4.4节以及相关源代码文件:

  • 系统调用的用户空间代码在 user/user.huser/usys.pl 中。
  • 内核空间代码是 kernel/syscall.hkernel/syscall.c
  • 与进程相关的代码是 kernel/proc.hkernel/proc.c

xv6手册阅读 理论篇

操作系统应该需要满足的要求

  • 多路复用:可以支持多个进程,让进程分时复用计算机的资源
  • 隔离:进程出错时,不能影响不依赖于它的进程,不影响操作系统
  • 交互:不同进程之间可以进行合理可控的交互

为什么需要操作系统?而不是直接将系统调用设计成一个库?什么时候可以设计成一个库?

直接用上面的操作系统需要满足的要求来回答即可:库函数实现无法满足多路复用、隔离

  • 不满足多路复用:不能保证进程定期放弃 CPU
  • 不满足隔离:不能保证进程之间的内存地址重叠导致覆盖
  • 操作系统可以抽象硬件:抽象硬件有利于编程,让程序员专注于程序而非硬件设备
  • 操作系统可以简化交互:提供文件描述符实现
  • 透明化进程切换:不需要应用程序来实现上下文切换

定制库需求:应用程序可以根据需求定制库,而不需要臃肿的操作系统,用于计算资源不那么多的嵌入式设备

强隔离的需求是什么样的?操作系统强隔离是怎么实现的?

强隔离要求

  • 程序出错时不能影响到其他进程、操作系统
  • 操作系统能够及时清理出错的进程

实现强隔离的一些支持

  • RISC-VCPU 的硬件支持
    • machine mode :完全特权指令,配置计算机
    • supervisor mode :特权指令
    • user mode :只能通过内核模式设置的少数系统调用进入内核,让内核执行特权指令后返回结果

xv6 采用宏内核的设计,内核组织有哪些架构?

内核的组织架构(通过操作系统的哪些指令在管理模式执行来区分)

  • 宏内核:整个操作系统都在管理模式运行
    • 好处:不需要考虑哪些指令放在用户模式执行;不同指令执行更好合作;
    • 缺点:接口复杂,导致更容易犯错,而一旦犯错,内核就崩溃
  • 微内核:最大限度减少在内核中的操作系统
    • 好处:内核部分的代码量少,减小错误的发生

xv6 以进程为隔离单位,需要为隔离实现哪些功能?

  • 用户/管理模式标志
  • 地址空间
  • 线程的时间切片

xv6 如何隔离进程的地址空间?

xv6 使用页表为每个进程提供自己的地址空间,页表结构如下图

  • trampoline :用于内核和用户态切换
  • trapframe
  • 全局变量
  • 指令

image-20250512181640033

xv6 如何维护进程的状态?

通过一个结构体 proc (**kernel/proc.h**:86)来记录

xv6手册阅读 代码篇

xv6 的源代码位置位于 kernel 文件夹下, defs.h 文件声明了接口,除此之外的 *.h 文件定义了各自 *.c 文件中用到的宏、结构体等

xv6 源文件概览

依次跟随以下文档阅读指定的源文件