0%

注意:请先看完环境配置(下)后再进行操作

配置xv6的运行环境

阅读全文 »

Lab File

前置知识

一、关于inode的结构

在xv6中,每一个文件(包括文件夹)对应一个inode。一个inode包含13个地址条目。前十二的地址直接指向了十二个数据块,第十三个地址指向了一个间接块,这个间接块储存了256个数据块的地址,每个地址对应一个数据块。

阅读全文 »

Lab Lazy

前置知识

一、原理

  1. 因为绝大多数情况,程序并不会全部使用它一开始申请的内存,所以eager allocation常常会出现浪费,为了避免这种情况,可以使用lazy allocation。
    阅读全文 »

Lab Lock

前置知识

一、 哈希表(略),双链表(略)

二、 buffer cache的LRU实现

buffer cache是一个双链表。每次新加入一个块,就会把它插到头指针后面,每次需要替换掉一个块,就选择一个头指针前面(也就是最后一个元素)进行替换。每一个块都有一个引用数,代表当前是否有进程在使用它。

阅读全文 »

Lab Mmap

前置知识

lab lazy, lab file

阅读全文 »

Lab Net

前置知识(略)

Task: Your Job

这个task要求我们补充两个函数。第一个函数是在ring中寻找一个空余位置来放置packet等待传输,第二个函数是遍历整个ring,将传输进来的packet发送给上层协议处理。因为我并没有学过计网,并不十分清楚内部的原理,因此暂时借鉴网友做法,待学成后再作进一步解释和补充。

阅读全文 »

Lab Page Table

前置知识

一、xv6三级page table 原理

  1. 在xv6 virtual address中,分为index,offset和EXT三部分。其中offset对标最终翻译后的physical address的后十二位,表示当前4096bit大小的page中的偏移量,而index平分为三个9位索引,分别表示三级PTE中的物理地址偏移量。
    阅读全文 »

Lab Syscall

前置知识

一、添加一个syscall的流程

  1. 当你想要添加编译一个user下的源文件,你需要把它加到Makefile中
    阅读全文 »

Lab Thread

前置知识

一、进程切换中的状态保存

在常规的强制进程切换时,需要kernel的调配。所以需要先切换到内核态,然后通过scheduler函数来切换到目标进程对应的内核态,然后再切换到user。在这个过程中,进程的切换需要保存的是context,而user和kernel的切换需要保存的是trapframe。

阅读全文 »

Lab Traps

前置知识

一、stack

  1. stack储存方式和heap相反,它是向下增长的,有两个重要的寄存器,fp和sp。fp指向当前frame的顶(上),sp指向的是当前frame的底(下)。
    阅读全文 »