# xv6-course **Repository Path**: whc_softHardware/xv6-course ## Basic Information - **Project Name**: xv6-course - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-06 - **Last Updated**: 2024-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #+TITLE: XV6 操作系统实践 #+AUTHOR: Jinghui Hu #+EMAIL: hujinghui@buaa.edu.cn #+DATE: <2023-10-24 Tue> #+STARTUP: overview num indent #+BEGIN_QUOTE 如果觉得讲解得好,请喝一杯咖啡也是极好的 #+END_QUOTE [[file:img/pay.jpg]] - Github [[https://github.com/Jeanhwea/xv6-course][link]] - Gitee 镜像 [[https://gitee.com/jeanhwea/course-xv6][link]] * 捐赠 好心的捐赠大佬可以备注一下: *xv6+昵称* 我会在下面会记录一下,感谢! | date | name | |------------------+------| | <2023-12-27 Wed> | V*i | | <2023-12-30 Sat> | *一 | * 简介 XV6 是 MIT 开发的一个教学用的完整的类 Unix 操作系统,并且在 MIT 的操作系统课程 6.828 中使用 1. 它源自 Dennis Ritchie 和 Ken Thompson 的 Unix Version 6 (v6) 2. 通过阅读并理解 XV6 的代码,可以清楚地了解操作系统中众多核心的概念 (1w) 3. 目前 MIT XV6 操作系统支持 x86 和 riscv 两种体系结构 * 主题 - 序言 1) [[file:01-x86-arch.org][x86 体系结构]] | [[https://www.bilibili.com/video/BV1cw411z7Ro][视频 01]] 2) [[file:02-qemu-simulator.org][QEMU 模拟器]] | [[https://www.bilibili.com/video/BV1me411R7MN][视频 02]] 3) [[file:03-minimal-os.org][编写最小操作系统]] | [[https://www.bilibili.com/video/BV1Fe411975E][视频 03]] - 走进操作系统 1) [[file:11-os-overview.org][操作系统概览]] | [[https://www.bilibili.com/video/BV1vu4y1h7mR/][视频 11]] 2) [[file:12-from-asm-to-c.org][从汇编到 C 语言]] | [[https://www.bilibili.com/video/BV1hM411Q7eb/][视频 12]] | [[https://www.bilibili.com/video/BV1a94y1G7HV/][视频 12a]] 3) [[file:13-xv6-startup.org][xv6 启动流程分析]] | [[https://www.bilibili.com/video/BV1az4y1A7zU/][视频 13]] - 内存管理 1) [[file:21-page-table.org][x86 体系结构分页机制]] | [[https://www.bilibili.com/video/BV1CC4y1778j/][视频 21]] 2) [[file:22-mem-init.org][开启分页及 freelist 初始化]] | [[https://www.bilibili.com/video/BV1bQ4y1n7iE/][视频 22]] 3) [[file:23-kmem-pgtab.org][内核页表初始化]] | [[https://www.bilibili.com/video/BV1Ew411x77A/][视频 23]] | [[https://www.bilibili.com/video/BV1ng4y19751/][视频 23a]] - 进程管理 1) [[file:31-intro-process.org][进程创建]] | [[https://www.bilibili.com/video/BV1Nz4y1A7BW/][视频 31]] 2) [[file:32-init-start.org][调度器启动及切换用户态地址空间]] | [[https://www.bilibili.com/video/BV1fu4y1N7D4/][视频 32]] 3) [[file:33-context-switch.org][上下文切换及内核态执行]] | [[https://www.bilibili.com/video/BV11g4y1Q7Ux/][视频 33]] 4) [[file:34-enter-shell.org][从 initcode 到 shell 启动]] | [[https://www.bilibili.com/video/BV1Fw411K7pE/][视频 34]] | [[https://www.bilibili.com/video/BV1eb4y1M7ie/][视频 34a]] | [[https://www.bilibili.com/video/BV1DG411U7vo/][视频 34b]] - 中断管理 1) [[file:41-intro-interrupt.org][中断初始化及调用流程]] | [[https://www.bilibili.com/video/BV14G411D74x][视频 41]] 2) [[file:42-exec-syscall.org][exec系统调用流程分析]] | [[https://www.bilibili.com/video/BV1194y1H7Wt/][视频 42]] 3) [[file:43-hw-interrupt.org][中断及设备初始化]] | [[https://www.bilibili.com/video/BV1XN411T7V7/][视频 43]] 4) [[file:44-multi-core-boot.org][多核处理器启动流程]] | [[https://www.bilibili.com/video/BV1Kb4y1u7zg/][视频 44]] 5) [[file:45-disk-driver.org][磁盘驱动]] | [[https://www.bilibili.com/video/BV1nC4y1P7yh/][视频 45]] - 锁与调度 1) [[file:51-locking.org][同步与锁]] | [[https://www.bilibili.com/video/BV1Lc411Q7Wr/][视频 51]] 2) [[file:52-sleeplock.org][sleeplock 与死锁]] | [[https://www.bilibili.com/video/BV1eM411o7cK/][视频 52]] 3) [[file:53-scheduling.org][调度、睡眠与唤醒]] | [[https://www.bilibili.com/video/BV1KN4y127NB/][视频 53]] 4) [[file:54-proc-lifecycle.org][进程生命周期]] | [[https://www.bilibili.com/video/BV1zG411i7fs][视频 54]] 5) [[file:55-pipe.org][管道]] | [[https://www.bilibili.com/video/BV1Lj411j7Fe/][视频 55]] - 文件系统 1) [[file:61-fs-overview.org][文件系统概览]] | [[https://www.bilibili.com/video/BV1ac411S7dL/][视频 61]] 2) [[file:62-buffer.org][Disk 和 Buffer]] | [[https://www.bilibili.com/video/BV1Lu4y1V73q/][视频 62]] 3) [[file:63-logging.org][Log 层]] | [[https://www.bilibili.com/video/BV1QN411L7S4/][视频 63]] 4) [[file:64-inode.org][inode 层]] | [[https://www.bilibili.com/video/BV1Nu4y1G757/][视频 64]] 5) [[file:65-directory-path.org][directory 层和 pathname 层]] | [[https://www.bilibili.com/video/BV1YC4y1R7Bn/][视频 65]] 6) [[file:66-file-descriptor.org][文件描述符层]] | [[https://www.bilibili.com/video/BV1ec41117jr/][视频 66]] - 总结 1) 总结 | [[https://www.bilibili.com/video/BV1eg4y1y7cm/][视频 90]] * 总结 #+BEGIN_SRC sh date #+END_SRC #+RESULTS: : Tue Dec 12 11:18:46 PM CST 2023 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 答疑一 [[file:12a-Q&A.org]] | [[https://www.bilibili.com/video/BV1a94y1G7HV/][视频 12a]] 2. 34a 答疑二 [[file:34a-Q&A.org]] | [[https://www.bilibili.com/video/BV1eb4y1M7ie/][视频 34a]] 2. 34b 答疑三 [[file:34b-Q&A.org]] | [[https://www.bilibili.com/video/BV1DG411U7vo/][视频 34b]] * 资源 1. MIT 课程官网 [[https://pdos.csail.mit.edu/6.828/2018/][6.828]] 2. x86 版本 [[https://github.com/mit-pdos/xv6-public][xv6-public]] 3. riscv 版本 [[https://github.com/mit-pdos/xv6-riscv][xv6-riscv]] 4. gas 手册 [[https://sourceware.org/binutils/docs/as/index.html][gas]] 5. Unix 源代码 [[https://www.tuhs.org/][Unix Heritage Society]]