xv6-lab2:系统调用
阅读
在你开始写代码之前,请阅读xv6手册《book-riscv-rev1》的第2章、第4章的第4.3节和第4.4节以及相关源代码文件:
- 系统调用的用户空间代码在 user/user.h 和 user/usys.pl 中。
- 内核空间代码是 kernel/syscall.h 、 kernel/syscall.c 。
- 与进程相关的代码是 kernel/proc.h 和 kernel/proc.c 。
xv6手册阅读 理论篇
操作系统应该需要满足的要求
- 多路复用:可以支持多个进程,让进程分时复用计算机的资源
- 隔离:进程出错时,不能影响不依赖于它的进程,不影响操作系统
- 交互:不同进程之间可以进行合理可控的交互
为什么需要操作系统?而不是直接将系统调用设计成一个库?什么时候可以设计成一个库?
直接用上面的操作系统需要满足的要求来回答即可:库函数实现无法满足多路复用、隔离
- 不满足多路复用:不能保证进程定期放弃
CPU
- 不满足隔离:不能保证进程之间的内存地址重叠导致覆盖
- 操作系统可以抽象硬件:抽象硬件有利于编程,让程序员专注于程序而非硬件设备
- 操作系统可以简化交互:提供文件描述符实现
- 透明化进程切换:不需要应用程序来实现上下文切换
定制库需求:应用程序可以根据需求定制库,而不需要臃肿的操作系统,用于计算资源不那么多的嵌入式设备
强隔离的需求是什么样的?操作系统强隔离是怎么实现的?
强隔离要求
- 程序出错时不能影响到其他进程、操作系统
- 操作系统能够及时清理出错的进程
实现强隔离的一些支持
RISC-V
的CPU
的硬件支持machine mode
:完全特权指令,配置计算机supervisor mode
:特权指令user mode
:只能通过内核模式设置的少数系统调用进入内核,让内核执行特权指令后返回结果
xv6
采用宏内核的设计,内核组织有哪些架构?
内核的组织架构(通过操作系统的哪些指令在管理模式执行来区分)
- 宏内核:整个操作系统都在管理模式运行
- 好处:不需要考虑哪些指令放在用户模式执行;不同指令执行更好合作;
- 缺点:接口复杂,导致更容易犯错,而一旦犯错,内核就崩溃
- 微内核:最大限度减少在内核中的操作系统
- 好处:内核部分的代码量少,减小错误的发生
xv6
以进程为隔离单位,需要为隔离实现哪些功能?
- 用户/管理模式标志
- 地址空间
- 线程的时间切片
xv6
如何隔离进程的地址空间?
xv6
使用页表为每个进程提供自己的地址空间,页表结构如下图
trampoline
:用于内核和用户态切换trapframe
:- 堆
- 栈
- 全局变量
- 指令
xv6
如何维护进程的状态?
通过一个结构体 proc
(**kernel/proc.h**:86)来记录
xv6手册阅读 代码篇
xv6
的源代码位置位于 kernel
文件夹下, defs.h
文件声明了接口,除此之外的 *.h
文件定义了各自 *.c
文件中用到的宏、结构体等
依次跟随以下文档阅读指定的源文件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 bhhxx's blog!