/xv6-course

💻 xv6 操作系统实践

Primary LanguageC

XV6 操作系统实践

如果觉得讲解得好,请喝一杯咖啡也是极好的

img/pay.jpg

捐赠

好心的捐赠大佬可以备注一下: xv6+昵称 我会在下面会记录一下,感谢!

datename
<2023-12-27 Wed>V*i
<2024-05-28 Tue>M*N

简介

XV6 是 MIT 开发的一个教学用的完整的类 Unix 操作系统,并且在 MIT 的操作系统课程 6.828 中使用

  1. 它源自 Dennis Ritchie 和 Ken Thompson 的 Unix Version 6 (v6)
  2. 通过阅读并理解 XV6 的代码,可以清楚地了解操作系统中众多核心的概念 (1w)
  3. 目前 MIT XV6 操作系统支持 x86 和 riscv 两种体系结构

主题

总结

date
  1. 开始录制时间 2023 年 10 月 23 日
  2. 内存相关
    • 但是很多操作系统的实现更加精巧;例如,
    • xv6 不能向磁盘中请求页,
    • 没有实现 copy-on-write 的 fork 操作
      • fork -> exec
    • 共享内存和惰性分配页(lazily-allocated page)
      • malloc(..)
    • x86 支持段式内存转换,但 xv6 仅用它来实现 proc 这种有固定地址
      • segment
      • paging
    • 在内存较多的机器上使用 x86 的 4MB 大小的“超级页”, xv6 不支持
      • database join/select
  3. 进程相关
    • 我们最好以锁为基础来构建高级的同步队列,虽然 xv6 并没有这么做
      • spinlock/sleeplock
      • queue, TaskPoolExecutor/ 信号量 semaphore
    • 让每个进程都有优先级。主要**是优先处理高优先级的可运行进程。
      • proc.c 优先级 nicevalue
    • 但是由于要权衡多项指标,例如要保证公平性和高的吞吐量,调度算法往往很快变得复杂起来
    • 复杂的调度算法还会无意中导致像优先级倒转(priority inversion)和护航(convoy)这样的现象
    • Linux 内核的 sleep 用一个显式的进程队列代替 xv6 中的等待队列(wait channel);而该队列本身内部还有锁
      • sleep/wakeup
    • 信号量是另一种合作机制
  4. 驱动相关
    • 用户在读一个文件的时候,这个文件的数据将会被拷贝两次。
      • 第一次是由驱动从硬盘拷贝到内核内存,之后通过 read 系统调用,从内核内存拷贝到用户内存。
      • ide => bcache buf->data
      • dinode => inode
      • 零拷贝
    • 日志记录不是唯一的崩溃后的恢复机制
      • recover_from_log / redo log
      • 比如,UNIX 系统中的 fsck 命令来检查每个文件和目录以及各个块和 i 节点可用的链表,
      • 查找并解决出现的不一致问题
    • 如果磁盘操作失败,xv6 报警
      • 使用冗余来掩饰磁盘错误
      • RAID 冗余磁盘阵列

答疑

  1. 12a 答疑一 12a-Q&A.org | 视频 12a
  2. 34a 答疑二 34a-Q&A.org | 视频 34a
  3. 34b 答疑三 34b-Q&A.org | 视频 34b

资源

  1. MIT 课程官网 6.828
  2. x86 版本 xv6-public
  3. riscv 版本 xv6-riscv
  4. gas 手册 gas
  5. Unix 源代码 Unix Heritage Society