Skip to content

Draymonders/xv6-course

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

XV6 操作系统实践

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

img/pay.jpg

简介

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

About

xv6 操作系统实践

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 28.3%
  • Makefile 26.3%
  • Assembly 24.6%
  • Shell 13.3%
  • GDB 5.3%
  • Perl 1.2%
  • Emacs Lisp 1.0%