摘要:
xv6启动流程 xv6内核地址空间 1 Riscv开机 riscv在启动时,pc被默认设置为0X1000,之后经过以下几条指令,跳转到0x80000000 在第一个shell,打开xv6 gdb模式make qemu-gdb 打开第二个shell,进行调试riscv64-unknown-elf-gd 阅读全文
摘要:
第二章 2.1、xv6代码结构 代码主要有三个部分组成: kernel: 我们可以ls kernel,里面包含了所有的内核文件。因为XV6是一个宏内核结构,这里所有的文件会被编译成一个叫做kernel的二进制文件,然后这个二进制文件会被运行在kernel mode中。 use: 基本上是运行在use 阅读全文
摘要:
Lab: mmap (hard) 一、要求 只要求实现mmap功能的子集,即对文件进行内存映射 mmap说明 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); map:成功时, 返回map的虚 阅读全文
摘要:
1. Large files (moderate) xv6中,一个block大小为1024b,块编号需要4b表示,所以一个块最多容纳256个块编号。 当前 xv6 单个文件最多有12个直接块和一个间接块,一个间接块最多放置256个块,一共268个块。 目标:单个文件增大到65803个块,即需要增加一 阅读全文
摘要:
第八章 文件系统 xv6文件系统类似于Unix的文件、目录和路径名,并将数据持久化到virtio磁盘上。文件系统解决以下难题: 文件系统需要磁盘上的数据结构来表示目录和文件名称树,记录保存每个文件内容的块的标识,记录磁盘的哪些区域是空的。 文件系统必须支持崩溃恢复(crash recovery)。如 阅读全文
摘要:
Uthread: switching between threads (moderate) Riscv32 Callee寄存器 Name ABI Name Description Saver x0 zero Zero - x1 ra Return address Caller x2 sp Stack 阅读全文
摘要:
第七章 调度 进程数 > CPU核数,需要在进程之间共享cpu,理想情况下,这种共享对用户进程透明。 一种常见的方法是,将进程多路复用到CPU上,使每个进程都有独享CPU的错觉。 7.1 多路复用 Xv6会在两种情况下,切换正在运行的进程。 进程等待设备或管道I/O完成、等待子进程退出,或在slee 阅读全文
摘要:
Memory allocator (moderate) 代码地址 https://github.com/INnoVationv2/xv6-labs-2023/commit/6a93f5a9a5fca0627f9d44f185a33f30f3b8cd16 Buffer cache (hard) 创建多 阅读全文
摘要:
第六章 锁 本章解释为什么xv6需要锁,xv6如何实现和使用锁。 6.1 竞态条件 可以将锁视为串行化并发的临界区域,使得任意时刻只有一个进程在运行这部分代码,从而保证正确。 尽管正确使用锁可以改正不正确的代码,但锁会限制性能。 锁的位置对性能也很重要。例如,在push中把acquire的位置提前也 阅读全文
摘要:
一、E1000初始化 1.main void main() { ... #ifdef LAB_NET pci_init(); sockinit(); #endif ... } 2.pci_init void pci_init() { // e1000的寄存器映射到此地址. // vm.c maps 阅读全文