MIT6s081
文章平均质量分 83
linqwer1
记录自己的学习过程~
展开
-
MIT 6s081 lab5.xv6文件系统
int valid;int disk;uint dev;//块号//睡眠锁//引用该块的个数//该buf的前一个buf//该buf的后一个buf// 缓存的数据xv6使用一些数据结构来定义日志区int n;// 日志的大小 int block [ LOGSIZE ];// 日志的位置关系信息 };int start;//日志区第一块块号 int size;// 日志区的大小 int outstanding;原创 2024-01-30 11:51:50 · 1911 阅读 · 0 评论 -
MIT 6s081 lab4.xv6进程调度
首先对一些合法性进行判断,此时必须持有当前进程的锁,该cpu的锁的链表长度不超过1(否则会发生死锁问题),当前进程为运行态,中断是否已经关闭,记录当前CPU的初始的中断开关状态,然后调用swtch进程上下文切换,此时进入内核进程中(调度器进程)。在这里,进程上下文中不仅包含了这些寄存器,还保存了ra寄存器和sp寄存器,分别保存了返回地址(用于进程恢复时指令从正确的位置开始运行),sp寄存器(用于进程被重新调度后内核栈正确恢复)另外一个发生调度的地方在睡眠锁的使用中,也就是。原创 2024-01-23 20:46:40 · 1032 阅读 · 0 评论 -
MIT 6s081 lab3.xv6自旋锁和休眠锁
xv6实现了两种锁:自旋锁和休眠锁,来保证临界资源的互斥访问。锁的特性就是只有一个进程可以获取锁,在任何时间点都不能有超过一个锁的持有者。原创 2024-01-17 16:55:25 · 507 阅读 · 0 评论 -
MIT 6s081 blog2.xv6 Trap(陷阱)机制
trap机制:每当程序执行、一个设备触发了使得当前程序运行需要响应内核设备驱动。从来源上看,陷阱可以分为用户态陷阱(系统调用、严重错误、中断)和内核态陷阱(严重错误、中断)。原创 2024-01-17 10:42:58 · 1156 阅读 · 0 评论 -
MIT 6s081 blog1.xv6内存管理
如xv6指导书中图3.3:从0x80000000开始的地址为内核地址空间,CLINT、PLIC、uart0、virtio disk等为I/O设备(内存映射I/O),可以看到xv6虚拟地址到物理地址的映射,大部分是相等的关系。在kernel/memlayout.h中对内存分布进行了宏定义。原创 2024-01-15 15:32:51 · 1595 阅读 · 1 评论 -
MIT 6s081 lab11:networking
本章实验主要是完成E1000网卡驱动程序,核心在于transmit 与 recv函数。原创 2024-01-15 19:38:42 · 367 阅读 · 0 评论 -
MIT 6s081 lab10:mmap
给xv6添加mmap和munmap功能,将文件映射到进程的地址空间。原创 2024-01-15 19:37:01 · 992 阅读 · 0 评论 -
MIT 6s081 lab9:file system
文件系统的实验,需要对提前阅读fs.c\bio.c\sysfile.c以及相关头文件。原创 2024-01-15 19:34:18 · 1108 阅读 · 0 评论 -
MIT 6s081 lab8:locks
优化思路:建立一个blockno到buf的hash table,为每个桶单独加锁(降低锁的粒度),当两个进程同时访问的块哈希到同一个桶时,才会发生竞争,当桶中的空闲Buf不足时,从其他桶中获取Buf,并采用时间戳(全局ticks)的优化方式替换原本的双向链表。2、从0开始遍历其他桶,在每个桶中查找引用计数为0的最近最久没有使用的Buf,如果有,则先将这个buf从原本的桶中删去,再将这个buf添加到桶key,并修改buf的内容,返回。1、首先为每个CPU分配一个全局的内存空闲列表和锁,并完成初始化。原创 2024-01-15 19:32:27 · 911 阅读 · 0 评论 -
MIT 6s081 lab7:Multithreading
在调用本函数 uthread_switch() 的过程中,caller-saved registers 已经被调用者保存到栈帧中了,所以这里无需保存这一部分寄存器。当线程进入barrier时,将已进入屏障的线程数+1,然后判断是否全部到达,如果未到达,则休眠等待,如果已经到达,就唤醒所有在等待的线程,所有线程继续运行。这个实验其实相当于在用户态重新实现一遍 xv6 kernel 中的 scheduler() 和 swtch() 的功能,所以大多数代码都是可以借鉴的。实现一个用户态的线程库。原创 2024-01-15 19:26:54 · 411 阅读 · 0 评论 -
MIT 6s081 lab6:Copy-on-Write Fork for xv6
实现 fork 懒复制机制,在进程 fork 后,不立刻复制内存页,而是将虚拟地址指向与父进程相同的物理地址。在父子任意一方尝试对内存页进行修改时,才对内存页进行复制。物理内存页必须保证在所有引用都消失后才能被释放,这里需要有引用计数机制。一开始做的时候没有上锁,一直没通过全部测试。后来参考了下面这位大佬的博客后意识到了竞争问题,加入自旋锁后顺利通过测试。原创 2024-01-15 19:24:21 · 1008 阅读 · 0 评论 -
MIT 6s081 lab5: xv6 lazy page allocation
虚拟内存的两个主要的优点:1、隔离性:每个应用程序拥有自己的地址空间,因此不可能修改其他应用程序的内存数据,同时用户空间和内核空间也具备隔离性2、抽象,处理器和指令可以使用虚拟地址,内核会定义从虚拟地址到物理地址的映射关系page fault可以使得地址映射关系变得动态,内核可以更新page table,内核将会有巨大的灵活性。原创 2024-01-15 16:24:21 · 1054 阅读 · 0 评论 -
MIT 6s081 lab4:traps
根据指导书的内容,完成backtrace的,本质上就是根据栈帧的结构进行偏移得到函数返回地址和上一个栈帧的地址,然后进行回溯(笔者采用循环的方式进行回溯,当超过内核地址空间范围时退出循环。test2使用的定时处理程序,运行比较慢,还没运行完,设定的tick又到了,于是又去执行定时处理程序,这就导致了死循环,解决方案:添加一个防止重入的标志。3、在proc.h中添加3个字段,用于保存定时的间隔、handler的地址、定时启动后经过的tick,然后在allocproc中对这三个字段初始化。原创 2024-01-15 16:19:03 · 900 阅读 · 0 评论 -
MIT 6s081 lab3:page tables
本实验的目标:修改页表、简化从用户态拷贝数据到内核态的方法其实页表就几个操作:创建页表、添加PTE项,查找PTE项,清空PTE项,释放PTE对应的物理空间,释放页表本身占用的物理空间。原创 2024-01-15 16:12:24 · 988 阅读 · 0 评论 -
MIT 6s081 lab2:system calls
U/_traceprocfork()1、在用户层声明接口2、在内核中,把用户调用的参数读入,然后传给进程结构体的参数3、在fork中,把父进程的参数拷贝给子进程4、在syscall统一的接口中(通过确定系统调用的编号,作为函数指针数组中的索引,进而调用到具体的函数,函数调用的参数从进程的参数中获取argint函数。原创 2024-01-15 16:01:58 · 398 阅读 · 0 评论 -
MIT 6s081 lab1:Xv6 and Unix utilities
作业网址:https://pdos.csail.mit.edu/6.828/2020/labs/util.html。原创 2024-01-15 15:55:47 · 1110 阅读 · 0 评论 -
MIT 6s081 lab 0.环境配置
安装虚拟机、换源。转载 2024-01-15 15:28:38 · 90 阅读 · 0 评论