如果觉得讲解得好,请喝一杯咖啡也是极好的
好心的捐赠大佬可以备注一下: xv6+昵称 我会在下面会记录一下,感谢!
date | name |
---|---|
<2023-12-27 Wed> | V*i |
<2024-05-28 Tue> | M*N |
XV6 是 MIT 开发的一个教学用的完整的类 Unix 操作系统,并且在 MIT 的操作系统课程 6.828 中使用
- 它源自 Dennis Ritchie 和 Ken Thompson 的 Unix Version 6 (v6)
- 通过阅读并理解 XV6 的代码,可以清楚地了解操作系统中众多核心的概念 (1w)
- 目前 MIT XV6 操作系统支持 x86 和 riscv 两种体系结构
- 序言
- 走进操作系统
- 内存管理
- 进程管理
- 进程创建 | 视频 31
- 调度器启动及切换用户态地址空间 | 视频 32
- 上下文切换及内核态执行 | 视频 33
- 从 initcode 到 shell 启动 | 视频 34 | 视频 34a | 视频 34b
- 中断管理
- 中断初始化及调用流程 | 视频 41
- exec系统调用流程分析 | 视频 42
- 中断及设备初始化 | 视频 43
- 多核处理器启动流程 | 视频 44
- 磁盘驱动 | 视频 45
- 锁与调度
- 文件系统
- 总结
- 总结 | 视频 90
date
- 开始录制时间 2023 年 10 月 23 日
- 内存相关
- 但是很多操作系统的实现更加精巧;例如,
- xv6 不能向磁盘中请求页,
- 没有实现 copy-on-write 的 fork 操作
- fork -> exec
- 共享内存和惰性分配页(lazily-allocated page)
- malloc(..)
- x86 支持段式内存转换,但 xv6 仅用它来实现 proc 这种有固定地址
- segment
- paging
- 在内存较多的机器上使用 x86 的 4MB 大小的“超级页”, xv6 不支持
- database join/select
- 进程相关
- 我们最好以锁为基础来构建高级的同步队列,虽然 xv6 并没有这么做
- spinlock/sleeplock
- queue, TaskPoolExecutor/ 信号量 semaphore
- 让每个进程都有优先级。主要思想是优先处理高优先级的可运行进程。
- proc.c 优先级 nicevalue
- 但是由于要权衡多项指标,例如要保证公平性和高的吞吐量,调度算法往往很快变得复杂起来
- 复杂的调度算法还会无意中导致像优先级倒转(priority inversion)和护航(convoy)这样的现象
- Linux 内核的 sleep 用一个显式的进程队列代替 xv6 中的等待队列(wait channel);而该队列本身内部还有锁
- sleep/wakeup
- 信号量是另一种合作机制
- 我们最好以锁为基础来构建高级的同步队列,虽然 xv6 并没有这么做
- 驱动相关
- 用户在读一个文件的时候,这个文件的数据将会被拷贝两次。
- 第一次是由驱动从硬盘拷贝到内核内存,之后通过 read 系统调用,从内核内存拷贝到用户内存。
- ide => bcache buf->data
- dinode => inode
- 零拷贝
- 日志记录不是唯一的崩溃后的恢复机制
- recover_from_log / redo log
- 比如,UNIX 系统中的 fsck 命令来检查每个文件和目录以及各个块和 i 节点可用的链表,
- 查找并解决出现的不一致问题
- 如果磁盘操作失败,xv6 报警
- 使用冗余来掩饰磁盘错误
- RAID 冗余磁盘阵列
- 用户在读一个文件的时候,这个文件的数据将会被拷贝两次。
- 12a 答疑一 12a-Q&A.org | 视频 12a
- 34a 答疑二 34a-Q&A.org | 视频 34a
- 34b 答疑三 34b-Q&A.org | 视频 34b
- MIT 课程官网 6.828
- x86 版本 xv6-public
- riscv 版本 xv6-riscv
- gas 手册 gas
- Unix 源代码 Unix Heritage Society