
MIT 6.S081
文章平均质量分 84
juruo_c
研一菜狗 致力于研究各种计算机底层技术
展开
-
【MIT 6.S081】课程介绍与Lab汇总
从3月份到5月份,我断断续续(4月份开始实习了时间片比较零碎)看完了Lec1-Lec15,也就是xv6book相应章节的讲解,并做完了Lab1-Lab9,后面一些lecture和两个lab涉及论文的阅读和讲解,暂时不准备看了,等后面有时间再来填坑!为MIT的本科生操作系统课程,由浅入深的讲解了页表、trap、系统调用、中断、锁、文件系统等操作系统概念及其在xv6中的实现,个人收获颇丰,也是第一次学习操作系统,每一部分的源码都详细的看了一遍,感觉非常棒!以下为我对每一个Lab的理解与实现,如有瑕疵,请指正!原创 2023-05-15 15:34:52 · 1375 阅读 · 0 评论 -
【MIT 6.S081】Lab9: file system
这个lab难度不大,主要理解file system中几个较高层的函数就可以做笔者用时约3h。原创 2023-05-15 15:32:10 · 1179 阅读 · 0 评论 -
【MIT 6.S081】Lab8: Locks
这个lab比起上个lab难度大了一些,需要熟练掌握锁的使用。笔者用时约7h(我太菜啦。原创 2023-04-19 09:02:26 · 789 阅读 · 2 评论 -
【MIT 6.S081】Lab7: Multithreading
本Lab比较简单,就是为xv6添加一个用户级的多线程功能,然后熟悉一下Linux下多线程编程。笔者用时约2h。原创 2023-04-06 20:14:31 · 610 阅读 · 0 评论 -
【MIT 6.S081】Lab6: Copy-on-Write Fork for xv6
xv6中原始fork系统的实现是,当产生一个子进程时,直接把父进程页表中的每一页复制给子进程的页表,这样子做无疑有许多物理空间被浪费,因为并不是每一个空间都会在之后被修改。一个经典的思路就是,也就是一开始父子进程共享一块物理空间,当某一个物理空间需要被写的时候,再进行复制。具体的做法就是,当父进程fork出一个子进程的时候,关闭父进程所有页表项的写权限,然后进行复制,复制时父子进程映射到相同的物理地址空间。当代码对没有写权限的页表项进行写操作时,有两种情况,分为内核态与用户态,如果在用户态,则会产生。原创 2023-04-05 13:56:47 · 658 阅读 · 0 评论 -
【MIT 6.S081】Lab5: xv6 lazy page allocation
xv6中的用户程序使用sbrk系统调用向内核请求增长堆内存或者缩减堆内存。对于增长内存的情况,用户往往会申请多于实际需要的内存以便使用。于是,对于暂未使用的内存,如果在用户申请时就将其分配给用户,挺浪费的。基于这样一种思想,当用户申请增长内存时,暂时不分配物理内存,而是仅增长用户进程的空间大小。这时如果用户实际使用到了新分配的内存,则会引发page fault(因为进程页表暂未维护该内存的虚拟地址与物理地址的映射)。page fault。原创 2023-03-31 10:26:20 · 743 阅读 · 0 评论 -
【MIT 6.S081】Lab4: traps
首先讲讲我对系统调用时trap的理解,用户程序通过系统调用进入内核态,在汇编代码中的体现就是ecall指令,会把系统调用参数保存在寄存器a7中。在用户态中执行ecall指令之后,会将pc寄存器的内容复制到sepc中,并将模式转换为监督者模式,且会将stvec复制到pc中。由于stvec的值为函数uservec(定义在)的地址,故在执行完ecall指令之后,会跳转到uservec函数中。由于ecall指令并没有切换页表的功能,于是在用户页表中必须要维护uservec函数虚拟地址的映射。原创 2023-03-28 21:00:32 · 960 阅读 · 0 评论 -
【MIT 6.S081】Lab3: page tables
PgtblPrint a page tableA kernel page table per processSimplify copyin/copyinstr本Lab简单优化了系统的页表功能,使得程序在内核态时可以直接解析用户态的指针。笔者用时约8hPrint a page table第一部分是为系统添加一个打印给定页表的函数vmprint,该函数接收一个参数pagetable(根页表的物理地址),递归遍历整张页表,打印有效的表项。参考freewalk函数(定义在kernel/vm.c:331),原创 2023-03-23 13:08:50 · 700 阅读 · 0 评论 -
【MIT 6.S081】Lab2: system calls
根据文档说明,当我们添加一个系统调用时,比如第一个任务是添加一个trace首先将系统调用的原型添加到中,比如trace函数接收一个参数作为掩码,其函数原型如下图所示。然后添加一个存根到中,如下图所示。将系统调用编号添加到中,如下图所示。在中添加相关的系统调用函数即可,如sys_trace函数,实现对应的功能即可。原创 2023-03-18 17:03:03 · 1115 阅读 · 0 评论 -
【MIT 6.S081】Lab1: Xv6 and Unix utilities
根据文档说明,我们需要把写的每个程序文件放在user文件夹下,并且在MakeFile的UPROGS添加相应的程序名,这样子就可以在qemu中直接用命令行指令调用相应的程序啦。如下图所示。sleepsleep程序接收一个参数,调用库函数sleep进行睡眠即可,没啥好说滴。if(argc!exit(0);pingpong。原创 2023-03-08 23:53:22 · 600 阅读 · 0 评论