mit6.s081
文章平均质量分 91
mit6.s081
陌养
永远相信美好的事情正在发生
展开
-
笔记 Lab9: File System | 文件系统
Large files (moderate)Modify bmap() so that it implements a doubly-indirect block, inaddition to direct blocks and a singly-indirect block. You’ll have tohave only 11 direct blocks, rather than 12, to make room for your newdoubly-indirect block; you’r转载 2023-11-23 22:22:08 · 636 阅读 · 0 评论 -
Lec15 Crash recovery
xv6文件系统实现分为七层,如图所示。原创 2023-11-21 16:35:29 · 142 阅读 · 0 评论 -
Lec14 File systems 笔记
文件系统中核心的数据结构就是和。原创 2023-11-18 21:43:23 · 299 阅读 · 0 评论 -
Lab8: Locks | 锁优化实现
kalloc()有一个空闲列表,由单个锁保护,这个在并发量较高时会产生争用的情况。kalloc 原本的实现中,使用 freelist 链表,将空闲物理页本身直接用作链表项(这样可以不使用额外空间)连接成一个链表,在分配的时候,将物理页从链表中移除,回收时将物理页放回链表中。这里解决性能热点的思路是「将共享资源变为不共享资源」。但是上述代码有可能会产生死锁的情况,cpu_a 持有自己的锁尝试偷 cpu_b,cpu_b持有自己的锁尝试偷 cpu_a,解决方案。转载 2023-11-12 16:19:20 · 153 阅读 · 0 评论 -
Lec13 Sleep & Wake up
进程切换的流程阻止其他CPU核的调度器线程在当前进程完成切换前,发现进程是RUNNABLE的状态并尝试运行它在进程切换的最开始,进程先获取自己的锁,并且直到调用switch函数时也不释放锁。而另一个线程,也就是调度器线程会在进程的线程完全停止使用自己的栈之后,再释放进程的锁。释放锁之后,就可以由其他的CPU核再来运行进程的线程,因为这些线程现在已经不在运行了。原创 2023-11-08 21:21:51 · 133 阅读 · 0 评论 -
Lab7: Multithreading
这里的线程相比现代操作系统中的线程而言,更接近一些语言中的“协程”(coroutine)。原因是这里的“线程”是完全用户态实现的,多个线程也只能运行在一个 CPU 上,并且没有时钟中断来强制执行调度,需要线程函数本身在合适的时候主动 yield 释放 CPU。添加的部分为设置上下文中 ra 指向的地址为线程函数的地址,这样在第一次调度到该线程,执行到 thread_switch 中的 ret 之后就可以跳转到线程函数从而开始执行了。设置 sp 使得线程拥有自己独有的栈,也就是独立的执行流。转载 2023-11-06 16:50:13 · 116 阅读 · 0 评论 -
Lec11 Thread switching (Robert)
线程就是单个串行执行代码的单元,它只占用一个CPU并且以普通的方式一个接一个的执行指令。线程还具有状态,我们可以随时保存线程的状态并暂停线程的运行,并在之后通过恢复状态来恢复线程的运行。原创 2023-10-31 20:58:07 · 221 阅读 · 0 评论 -
Lab 6: Copy-on-write fork
实现 fork 懒复制机制,在进程 fork 后,不立刻复制内存页,而是将虚拟地址指向与父进程相同的物理地址。在父子任意一方尝试对内存页进行修改时,才对内存页进行复制。物理内存页必须保证在所有引用都消失后才能被释放,这里需要有引用计数机制。原创 2023-10-29 15:57:05 · 231 阅读 · 0 评论 -
Lec09 Interrupts | 中断
管理设备的代码称为驱动,所有的驱动都在内核中。我们今天要看的是UART设备的驱动,代码在uart.c文件中。如果我们查看代码的结构,我们可以发现大部分驱动都分为两个部分,bottom/top。bottom部分通常是Interrupt handler。当一个中断送到了CPU,并且CPU设置接收这个中断,CPU会调用相应的Interrupt handler。Interrupt handler并不运行在任何特定进程的context中,它只是处理中断。top部分,是用户进程,或者内核的其他部分调用的接口。原创 2023-10-24 23:17:45 · 211 阅读 · 0 评论 -
Lec08 Page faults笔记总结
当一个用户应用程序触发了page fault,page fault会使用与Robert教授上节课介绍的相同的trap机制,将程序运行切换到内核,同时也会将。在SCAUSE(注,Supervisor cause寄存器,保存了trap机制中进入到supervisor mode的原因)寄存器的介绍中,有多个与page fault相关的原因。比如,13表示是因为load引起的page fault;15表示是因为store引起的page fault;12表示是因为指令执行引起的page fault。原创 2023-10-23 15:39:22 · 148 阅读 · 0 评论 -
Lab5: Lazy Page Allocation | 内存页懒分配
首先修改 sys_sbrk,使其不再调用 growproc(),而是只修改 p->sz 的值而不分配物理内存。实现n为负的情况,实现内存页面的释放。实现一个内存页懒分配机制,在调用 sbrk() 的时候,不立即分配内存,而是只作记录。在访问到这一部分内存的时候才进行实际的物理内存分配。由于懒分配的页,在刚分配的时候是没有对应的映射的,所以要把一些原本在遇到无映射地址时会 panic 的函数的行为改为直接忽略这样的地址。懒分配的内存页在被 touch 后就可以被使用了。接着运行测试函数,进行对应的评估。转载 2023-10-24 10:06:52 · 158 阅读 · 0 评论 -
Lec 3 OS Organization and System Calls总结
参考资料。转载 2023-10-13 11:26:36 · 168 阅读 · 0 评论 -
Lab3:page tables
参考资料kern/vm.c。转载 2023-10-18 15:04:40 · 82 阅读 · 0 评论 -
Lab2: System calls总结
比如 int arr[] = {[3] 2333, [6] 6666} 代表 arr 的下标 3 的元素为 2333,下标 6 的元素为 6666,其他元素填充 0 的数组。xv6 中,空闲内存页的记录方式是,将空虚内存页本身直接用作链表节点,形成一个空闲页链表,每次需要分配,就把链表根部对应的页分配出去。首先在 proc.h 中修改 proc 结构的定义,添加 syscall_trace field,用 mask 的方式记录要 trace 的 system call。这里 xv6 采用的是空闲链表法。转载 2023-10-12 15:05:15 · 98 阅读 · 0 评论 -
Lab 1: Unix utilities汇总
这个实验主要学习了常用的一些系统调用。原创 2023-10-10 19:47:38 · 557 阅读 · 0 评论 -
Lec 4 Page tables
参考资料。转载 2023-10-13 21:05:47 · 161 阅读 · 0 评论 -
xv6 lec6 陷入与系统调用
Trampoline page 在进程切换过程中充当临时的桥梁,确保进程切换的顺利执行。,其中保存的是当发生trap时的程序计数器,因为可能发生这种情况:当程序还在内核中执行时,我们可能切换到另一个进程,并进入到那个程序的用户空间,然后那个进程可能再调用一个系统调用进而导致SEPC寄存器的内容被覆盖。在trapframe中的寄存器的值放回到进程对应寄存器后,交换sscratch与a0的值,那么sscratch中就有了trapframe的地址,a0中存的就是系统调用的返回值,最后再执行sret返回。转载 2023-10-20 11:38:12 · 74 阅读 · 0 评论 -
笔记 Lab4: Traps | 中断陷阱
这样,在每次时钟中断的时候,如果进程有已经设置的时钟(alarm_interval!当 alarm_ticks 倒数到小于等于 0 的时候,如果没有正在处理的时钟,则尝试触发时钟,将原本的程序流保存起来(*alarm_trapframe = *trapframe),然后通过修改 pc 寄存器的值,将程序流转跳到 alarm_handler 中,alarm_handler 执行完毕后再恢复原本的执行流(*trapframe = *alarm_trapframe)。剩下的为保存的寄存器、局部变量等。转载 2023-10-21 21:16:36 · 82 阅读 · 0 评论 -
MIT6.S081 第一章笔记
6.S081 / Fall 2020 [麻省理工操作系统 - 2020 年秋季]risc-v版本的xv6 跑在 RISC-V微处理器上,没用x86的指令集。转载 2023-10-12 17:08:52 · 168 阅读 · 0 评论