├── 1.安装教程 ├── 教程.assets │ ├── image-20210128172139499.png │ ├── image-20210128172157205.png │ ├── image-20210128172300377.png │ ├── image-20210128172310526.png │ ├── image-20210128172317423.png │ ├── image-20210128172433866.png │ ├── image-20210128172450517.png │ ├── image-20210128172502053.png │ ├── image-20210128172549260.png │ ├── image-20210128172619445.png │ └── image-20210128172641394.png ├── docker.md ├── Ubuntu20.md └── wsl.md ├── 3.辅助资源 └── MIT-Video.md ├── 2.Hints补充 └── README.md ├── README.md └── 4.反馈 └── 对exercise的改进建议.md /1.安装教程/教程.assets/image-20210128172139499.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172139499.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172157205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172157205.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172300377.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172300377.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172310526.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172310526.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172317423.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172317423.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172433866.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172433866.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172450517.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172450517.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172502053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172502053.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172549260.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172549260.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172619445.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172619445.png -------------------------------------------------------------------------------- /1.安装教程/教程.assets/image-20210128172641394.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhenyu-zang/xv6-pku-hints/HEAD/1.安装教程/教程.assets/image-20210128172641394.png -------------------------------------------------------------------------------- /1.安装教程/docker.md: -------------------------------------------------------------------------------- 1 | ## 1.如果你了解并安装了docker 2 | ### 1.1 准备 3 | 首先需要linux环境,主流的linux系统都可以,如果你是windows系统可以按 [网上的一些教程](https://www.cnblogs.com/fuzongle/p/12760193.html) 安装虚拟机,这里推荐vmware 4 | ### 1.2 教程 5 | 已经有前人对riscV版的xv6创建适配的docker环境 [wtakuo/xv6-env](https://hub.docker.com/r/wtakuo/xv6-env), 6 | 按照提示操作即可 7 | 8 | ## 2.如果你不太熟悉docker 9 | 建议先简单学习一下 [docker的基本操作](https://ruanyifeng.com/blog/2018/02/docker-tutorial.html) ,然后再按照上一小节安装 10 | 。docker是非常实用的工具,建议大家顺便学习一下 -------------------------------------------------------------------------------- /3.辅助资源/MIT-Video.md: -------------------------------------------------------------------------------- 1 | # MIT Video 2 | 3 | 如果在完成Lab的过程中遇到了实在无法解决的困难,不妨听听MIT的课。 4 | 5 | - [原课程视频](https://pdos.csail.mit.edu/6.828/2020/schedule.html) 6 | 7 | 除此之外,还可以在B站上去看其他的版本: 8 | 9 | - [中英双语字幕版](https://www.bilibili.com/video/BV19k4y1C7kA) 10 | + [Github](https://github.com/mayf09/6.S081-2020-video-subtitles) 11 | 12 | - [英文(机器添加)字幕版](https://www.bilibili.com/video/BV1CK411A7zX) 13 | 14 | - [中文(机器翻译)字幕版](https://www.bilibili.com/video/BV1Dy4y1m7ZE) 15 | -------------------------------------------------------------------------------- /2.Hints补充/README.md: -------------------------------------------------------------------------------- 1 | # xv6 Lab 2 | 3 | ## Lab1: Xv6 and Unix utilities 4 | 5 | Exercise3: pingpong 6 | 应建立两个单向通信的管道实现相互通信,而不是在一个管道上进行双向通信。 7 | 8 | ## Lab3: page tables 9 | 10 | Exercise2: A kernel page table per process 11 | 除去hints中的工作之外,你可能还需要修改vm.c中的kvmpa函数中的内容。 12 | 13 | 除去以上两个特例,还有大多数Lab通用的3个hints: 14 | 1. 若自己实现了某个新的函数,且需要跨文件调用,则必须将函数原型添加到kernel\defs.h中。 15 | 2. 若完成1之后跨文件调用仍然失败,则请检查是否需要额外引用一些头文件或者extern变量(借鉴别的.c文件的写法即可)。 16 | 3. 如需要添加新的系统调用,请参照Lab2(system calls)中Exercise1(System call tracing)中的hints完成相关流程。 17 | 这3点最早会在Lab2中遇到,并且在后续的Lab中会经常用到。 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xv6-pku-hints 2 | 3 | 这里面包含了往年选修北京大学操作系统课程并做MIT-xv6 lab的同学积累的经验。 4 | 5 | 欢迎同学们提pull request,增添更多hints与辅助资源,帮助我们改进。 6 | 7 | ## 1. 安装教程 8 | 9 | 第一部分为xv6 lab安装指南。 10 | 11 | - [Ubuntu20](1.安装教程/Ubuntu20.md) 12 | - [docker](1.安装教程/docker.md) 13 | - [WSL](1.安装教程/wsl.md) 14 | 15 | ## 2. Hints补充 16 | 17 | 第二部分是对于lab,总结的一些更加有用的提示。 18 | 19 | - [hints补充](2.Hints补充/README.md) 20 | 21 | 希望你能够根据我们的经验,避免踩坑。 22 | 23 | ## 3. 辅助资源 24 | 25 | 第三部分其它辅助资源。 26 | 27 | - [xv6-book中文翻译](https://github.com/FrankZn/xv6-riscv-book-Chinese),如发现翻译错误或可以改进的地方,欢迎提出issue或pull request。 28 | - [MIT Video](3.辅助资源/MIT-Video.md),强烈建议在lab卡住的时候观看此部分内容。 29 | 30 | ## 4. 反馈 31 | 32 | 第四部分是做完lab之后,同学们对于Lab的反馈。 33 | 34 | - [对exercise的改进建议](4.反馈/对exercise的改进建议.md) 35 | 36 | ## 5. 致谢 37 | 38 | 感谢以下同学对本仓库资源的贡献: 39 | 40 | 臧振宇,丁睿,刘俊豪,刘雨俊,何思齐,刘又铭,贾子菡。 -------------------------------------------------------------------------------- /4.反馈/对exercise的改进建议.md: -------------------------------------------------------------------------------- 1 | (这部分内容比较主观,不一定适用于所有人,也不一定就能起到很好的效果,只是提供一个可参考的建议) 2 | 操作系统的实现必然是繁琐的,需要处理诸多细节的。但如果只是按照hints一个个将细节处理下去,那么在写完后大概率会出现一些奇奇怪怪的细节错误,然后花上比实现时间多上数倍的时间去痛苦地调试。因此,我们既要把握住底层的细节,又要把握住顶层的原理。 3 | 4 | Lab5(xv6 lazy page allocation)的3个exercises的设计就为我们给出了一个很好的实践方法: 5 | 6 | ​ Exercise1(Eliminate allocation from sbrk())只需要删去sys_sbrk里分配内存的两行代码即可。看似简单,但却确定了目标。 7 | 8 | ​ Exercise2(Lazy allocation)则需要我们实现Lazy alloction函数主体。这正是我们应该先去把握的整体,需要先实现的主体。 9 | 10 | ​ Exercise3(Lazytests and Usertests)则需要我们去完善细节。这又是让我们在实现主体之后,再去完善细节。 11 | 12 | 像这样,先确定目标;再把握整体,实现主体;最后深入细节,完善细节,正是一种绝佳的在实践中解决问题的方法。 13 | 尤其是在面对Lab6(Copy-on-Write Fork for xv6)和Lab10(mmap)这两个只有一个exercise的Lab时,可以借鉴这样的方法。 14 | 15 | Lab6中,仿照这一方法可以分为三步: 16 | 17 | 1. 声明标志位PTE_C,在uvmcopy函数中删去内存分配和复制,改为取消PTE_W标记,加入PTE_C标记。 18 | 19 | 2. 实现copyonwrite函数处理Copy-on-Write下的内存分配和复制,然后在usertrap中遇到page fault和执行copyout时调用它。 20 | 3. 遵照hints完善其他细节,如声明一个数组来记录每个页面被引用的次数,在页面被引用次数为0时将其释放等。 21 | 22 | Lab10中也可以仿照这一方法,不过Lab10中细节更多,原来的第二步实际上要做三件事情,因此可以分为以下五步: 23 | 24 | 1. 声明vma结构体,并将其加入proc结构体中。 25 | 26 | 2. 实现sys_mmap函数主体。 27 | 3. 进行page fault的处理。 28 | 4. 实现sys_munmap函数主体。 29 | 5. 遵照hints完善其他细节。 30 | -------------------------------------------------------------------------------- /1.安装教程/Ubuntu20.md: -------------------------------------------------------------------------------- 1 | **完美避坑·五分钟搞定一切的XV6环境安装法·傻瓜版** 2 | 3 | Pain Is Inevitable; Suffering Is Optional 4 | 5 | 基于前人的教训,本帖是堪称手把手教你安装XV6环境的傻瓜级教程。你只需要严格按照我们列出的步骤一步步安装即可,如果你的网速在线,不是村里刚通那种,一共只需花费五分钟,工欲善其事必先利其器,我们开始吧。 6 | 7 | 1. 准备阶段 8 | 9 | 你需要一台安装了Ubuntu20的电脑或者虚拟机,如果你已经安装了Ubuntu但是版本比较低,还请你升级到Ubuntu20,或者直接重装一个虚拟机也并不麻烦,下载地址如下: 10 | 11 | https://ubuntu.com/download/desktop 12 | 13 | 安装好Ubuntu20后,我们还需要换源,这一步必不可少。 14 | 15 | 如图所示,搜索software,打开搜索结果中的软件与更新 16 | 17 | ![image-20210128172139499](教程.assets/image-20210128172139499.png) 18 | 19 | 点击其他站点 20 | 21 | ![image-20210128172157205](教程.assets/image-20210128172157205.png) 22 | 23 | 在 选择下载服务器中mirrors.ustc.edu.cn 24 | 25 | ![image-20210128172300377](教程.assets/image-20210128172300377.png) 26 | 27 | 关闭 软件与更新 28 | 29 | ![image-20210128172310526](教程.assets/image-20210128172310526.png) 30 | 31 | 在关闭时弹出的对话框中选择 重新载入 32 | 33 | ![image-20210128172317423](教程.assets/image-20210128172317423.png) 34 | 35 | 至此,我们便完成了准备阶段的工作,这一步完成了之后剩下的就很简单了。 36 | 37 | 2. 正式安装 38 | 39 | 打开终端,键入命令: 40 | 41 | ``` 42 | sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu 43 | ``` 44 | 45 | ![image-20210128172433866](教程.assets/image-20210128172433866.png) 46 | 47 | 耐心等待(用自己网的同学如果发现下载速度太慢可以挂校园网VPN)直到出现如下界面 48 | 49 | ![image-20210128172450517](教程.assets/image-20210128172450517.png) 50 | 51 | 键入命令: 52 | 53 | ``` 54 | git clone git://g.csail.mit.edu/xv6-labs-2020 55 | ``` 56 | 57 | ![image-20210128172502053](教程.assets/image-20210128172502053.png) 58 | 59 | 3. 完成与测试 60 | 61 | 接上图,耐心等待直到其执行完毕后,键入命令: 62 | 63 | ``` 64 | cd xv6-labs-2020/ 65 | ``` 66 | 67 | ![image-20210128172549260](教程.assets/image-20210128172549260.png) 68 | 69 | 我们来试试打开第一个lab,键入命令: 70 | 71 | ``` 72 | git checkout util 73 | ``` 74 | 75 | 再键入命令: 76 | 77 | ``` 78 | make qemu 79 | ``` 80 | 81 | ![image-20210128172619445](教程.assets/image-20210128172619445.png) 82 | 83 | 如若出现以下界面,便说明我们大功告成啦,我们还顺带完成了lab1的第一部分内容. 84 | 85 | ![image-20210128172641394](教程.assets/image-20210128172641394.png) 86 | 87 | 至此,XV6环境安装全部完成。请尽情享受 xv6 lab的热情款待(虐待)吧。 88 | 89 | -------------------------------------------------------------------------------- /1.安装教程/wsl.md: -------------------------------------------------------------------------------- 1 | WSL(Windows Subsystem for Linux)是Windows10系统级支持的运行Linux内核的方法,相比于虚拟机,其启动更快,访问windows文件也更加方便,缺点是没有图形界面 2 | 3 | 如果您的win10系统已经安装过WSL,那么很可能由于Hyper-V开启而无法兼容其他虚拟机。那为什么不用WSL来完成lab呢 4 | 5 | 步骤0到步骤5和[微软官方帮助](https://docs.microsoft.com/zh-cn/windows/wsl/install-win10)手动安装WSL2的方法**完全一致**,如果自己可以熟练安装WSL2,或更想参考官方文档,请在完成后跳到步骤6 6 | 7 | # 步骤 0:确保Windows版本可以支持 8 | 9 | 请确保您当前的系统是运行在x64下,版本号1903或更高,内部版本18362或更高的Windows 10 | 11 | 若要检查 Windows 版本及内部版本号,选择 Windows 徽标键 + R,然后键入“winver”,选择“确定”。 (或者在 Windows 命令提示符下输入 `ver` 命令) 12 | 13 | # 步骤 1:学会启动PowerShell 14 | 15 | 在“开始”按钮上点击右键,在菜单中选择`Windows PowerShell(管理员)`,即可启动PowerShell。在教程后文中可能会多次需要您在PowerShell中运行命令 16 | 17 | # 步骤 2:启用适用于 Linux 的 Windows 子系统 18 | 19 | 在PowerShell中运行命令 20 | ```powershell 21 | dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 22 | ``` 23 | 24 | # 步骤 3:启用虚拟机功能 25 | 26 | 在PowerShell中运行命令 27 | 28 | ```powershell 29 | dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 30 | ``` 31 | 32 | 然后重新启动计算机 33 | 34 | # 步骤 4:下载Linux内核更新包 35 | 36 | 下载 [适用于 x64 计算机的 WSL2 Linux 内核更新包 ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)并运行 37 | 38 | # 步骤 5:将 WSL 2 设置为默认WSL版本 39 | 40 | 在PowerShell中运行命令 41 | 42 | ```powershell 43 | wsl --set-default-version 2 44 | ``` 45 | 46 | # 步骤 6:安装Ubuntu 20.04 LTS 47 | 48 | 打开win10自带的应用商店,搜索`Ubuntu`,选择Ubuntu 20.04 LTS下载安装 49 | 50 | 注意:(即使已经安装过WSL也)请务必安装20.04,亲测更早的版本(18.04 LTS)是不可用的 51 | 52 | 安装完成后,在开始屏幕中启动Ubuntu 20.04 LTS,配置用户名和密码 53 | 54 | 进入Linux终端后,尝试运行`cat /etc/debian_version` 55 | 56 | 正确的结果应该为 57 | 58 | ``` 59 | bullseye/sid 60 | ``` 61 | 62 | # 步骤7:安装所需的软件包 63 | 64 | 在Linux Shell中运行 65 | 66 | ```bash 67 | sudo apt update 68 | sudo apt install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu 69 | ``` 70 | 71 | 会要求输入您的密码,并输入y确认下载,按提示操作即可 72 | 73 | 若觉得网速感人,可以更换镜像源 74 | 75 | 安装完成后,尝试运行`qemu-system-riscv64 --version` 76 | 77 | 正确的结果应该为 78 | 79 | ``` 80 | QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.14) 81 | Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers 82 | ``` 83 | 84 | # 步骤8:开始试用Lab 85 | 86 | 请参考[MIT的官方指南](https://pdos.csail.mit.edu/6.828/2020/labs/util.html) 87 | --------------------------------------------------------------------------------