6.s081
RedemptionC
这个作者很懒,什么都没留下…
展开
-
xv6 risc-v trap 笔记
xv6中trap(即让cpu暂停执行当前代码,去执行相应的处理代码的情况)有三种:系统调用 异常,如除以零 设备中断,例如完成了一次读写事件,当然也包括定时中断发生trap时,一般的处理是:控制转移到kernel kernel保存当前进程的相关状态(具体就是trampoline.s中,将寄存器保存到进程的trapframe,将栈顶指针设为内核栈的,恢复tp寄存器,让其保存当前cpu的id,从trapframe中取出内核页表页的地址,设置为satp的值,并刷新tlb,从tf中取出usertra原创 2020-09-22 13:31:36 · 2979 阅读 · 0 评论 -
[动态内存分配] Allocaotrs 3/3 : buddy system
第二个本来要写之前做过的alloc lab,但是粗略看了下感觉代码太晦涩了,结构体都没有,全都是指针操作=-=直接写buddy system,附上之前做alloc lab时的笔记链接:https://blog.csdn.net/RedemptionC/article/details/107368186buddy system基本特点根据cs:app,buddy system属于segregated fit的特例,segregated fit的特点是:维护一个空闲链表的数组,每个空闲链表和.原创 2020-08-15 18:52:15 · 547 阅读 · 0 评论 -
xv6 risc-v file system 笔记
disk一层,没有涉及到buffer cache 和 logging 已经分别写了博客所以本文从inode讲起:inode首先看文件系统的结构:inode有两层含义:磁盘上的inode和内存中的inode,磁盘中的inode数据结构如下:一系列dinode就保存在上图中inodes区里dinode的大小都相同,因此给出数字n(实际上就是inum),很容易定位到第n个inode// On-disk inode structurestruct dinode { sho..原创 2020-09-21 11:10:11 · 1192 阅读 · 0 评论 -
xv6 risc-v scheduler 笔记
做syscall和中期quiz时,都觉得,这一章比较复杂,掌握的不好,不管是switch,上下文切换,还是sleep/wakeup,所以还是要做笔记总结归纳一下context switch从一个用户进程切换到另一个需要以下步骤:首先通过trap(中断,系统调用,异常)完成用户->内核的转换,切换到当前进程的内核线程,然后通过switch(可能的情况是exit或者yield,两者都会调用sched->switch)切换到当前cpu的调度器线程(图中假设是单cpu,所以只有一个调度器原创 2020-09-19 21:08:56 · 1494 阅读 · 1 评论 -
xv6 risc-v file system logging layer
logging layerlogging layer的存在主要是为了解决崩溃恢复的问题因为很多文件系统调用包含了对磁盘的多次写入,所以如果在写入部分完成时发生崩溃就会导致磁盘上的数据处于不一致的状态:例如,如果崩溃发生在truncate(设置文件大小为0,释放他的内容块)中,那么可能导致如下两种状态:一个inode引用了一个磁盘块,但是该块被标记为free 一个块标记为allocated,但是没有inode引用它后者导致的后果比较温和,但前者会导致严重的后果:重启之后,该块(标记为f原创 2020-09-10 16:36:33 · 478 阅读 · 10 评论 -
MIT-6.s081-OS Lab: fs
本实验主要对xv6文件系统做出一些扩展:增加大文件的支持,以及符号链接的支持large files// On-disk inode structurestruct dinode { short type; // File type short major; // Major device number (T_DEVICE only) short minor; // Minor device number (T_DEVICE on原创 2020-09-06 19:17:18 · 1084 阅读 · 3 评论 -
MIT-6.s081-OS Lab: locks
本实验主要是重新设计锁,增加并行性分别是为kmem和bcache设计memory allocatorhttps://blog.csdn.net/RedemptionC/article/details/108127655这里对kalloc做了一点基本的分析他的设计是所有的cpu(NCPU为8,但是实际是3个)都使用一个freelist,这样lock contention就很高要做的改进是为每一个cpu设置一个free list,每个freelist一个锁,这样不同的cpu就能独立的进行分.原创 2020-09-04 15:44:08 · 3013 阅读 · 3 评论 -
xv6 risc-v lock notes
xv6中专门讲锁的篇幅并不多,锁的代码也在一两行左右,但是锁的使用却是无处不在的,而且要理解好也并不那么容易对锁的需求来自于interleaving(交错执行),这可能是多处理器环境下,也可能是单处理器环境下在不同进程/线程间切换cpu当他们需要访问共享的数据结构时,就出现了问题,如:一个进程在读一个数据时,可能另一个进程正在修改它,那么这个进程读到的数据就可能是不正确的 多个进程同时更新一个数据,那么可能只有最后完成的更新保留了下来,之前的更新都丢失了例如:这样一个数据结构,l.原创 2020-09-01 16:43:28 · 579 阅读 · 0 评论 -
xv6 risc-v bio.c code walk through
(感觉文件系统的代码还是挺多的 做个笔记首先上xv6 文件系统的结构图:bio.c负责的是buffer cache这一层bio.c有最详细的注释:Buffer cache.The buffer cache is a linked list of buf structures holdingcached copies of disk block contents. Caching disk blocksin memory reduces the number of di...原创 2020-08-30 16:11:34 · 481 阅读 · 0 评论 -
xv6 risc-v kalloc.c code walk through
kalloc是用于分配物理内存,比较简单,but to make it clear,这里还是做一个笔记struct run { struct run *next;};struct { struct spinlock lock; struct run *freelist;} kmem;首先这里定义了两个结构体,但是有一些细节需要注意:第一个结构体有名字,struct run,第二个没有,第二个的kmem是其定义的第一个结构体变量在系统启动时,会调用kinit,初始化这个内存分原创 2020-08-20 17:17:42 · 1131 阅读 · 0 评论 -
MIT-6.s081-OS mid-term quiz 2019
背景:修改free和bd_free,增加一个参数size,size是p指向的内存块的字节数。修改之后,buddy allocator的调用者要负责在返回块的时候指明块的大小。假设程序员调用free时传入的size始终是正确的问:修改后,还需要保留split数组吗...原创 2020-08-24 18:03:32 · 1015 阅读 · 0 评论 -
MIT-6.s081-OS lab syscall :user-level threads and alarm
warm up(对riscv汇编的熟悉,其实使用gdb调试汇编是”最好“的学习方法)回答一下几个问题:Which registers contain arguments to functions? For example, whichregister holds 13 in main's call to printf?这个很简单,从call.asm就能看出来,是a2 printf("%d %d\n", f(8)+1, 13); 24: 4635原创 2020-08-13 15:01:11 · 1146 阅读 · 14 评论 -
MIT-6.s081-OS lab cow: Copy-on-Write Fork for xv6
本实验仍然是虚拟内存,所以暂且跳过了中间的内容(指lec和课本)分析copy on write fork :在之前的code walk through(https://blog.csdn.net/RedemptionC/article/details/107709618)中提到了,fork的实现里,有一个uvmcopy的调用,作用是将父进程的内存复制到子进程中,这个复制包括申请物理内存,设置pte但是在下列情况下:父进程和子进程都不修改某些内存页 fork之后子进程马上调用exec,而原创 2020-08-03 22:27:06 · 2009 阅读 · 2 评论 -
MIT-6.s081-OS lab sh : Simple xv6 shell
实验说明:https://pdos.csail.mit.edu/6.828/2019/labs/sh.html离上次做完实验一快有二十多天了 期间不是不想做这个实验 主要是两个困难:1.不会使用gdb2. 要从头实现一个shell,并且要处理grep lion < data.txt | wc > count这种看起来很复杂的命令,我被吓住了,因为传说中的AST我不会,而有些博客写的用字符串处理的方式因为比较个性化我又看不懂,所以觉得很难,做起来很难受,不过总的来说,这二十原创 2020-06-25 22:18:14 · 2173 阅读 · 2 评论 -
MIT-6.s081-OS lab lazy: xv6 lazy page allocation
本实验要实现的是lazy allocation很多时候,一个进程可能使用sbrk申请了大量的内存,但是其中的大部分并没有使用,造成了浪费我们要做的是修改sbrk的实现,sbrk不分配物理内存,just remember which addresses are allocated当进程第一次试图使用任何内存时,产生一个page fault,再让kernel分配内存,清零,映射...原创 2020-08-01 17:41:12 · 3090 阅读 · 26 评论 -
xv6 risc-v 虚拟内存 code walk through
最近做lazy lab做的有点头大,突然发现是自己遗漏了一些内容,即lec5,6,因为刚开始看的时候很多看不懂,就跑去看书了,后来就一直没有回来看lecture所以为了提高效率,应该快速的把书看一遍,然后回来看lecture,再带着问题去看书看代码code walk throughkvminitvoid kvminit(){ // 确定64bit的一级目录地址 kernel_pagetable = (pagetable_t) kalloc(); memset(kernel.原创 2020-08-01 15:37:48 · 1692 阅读 · 0 评论 -
MIT-6.s081-OS lab alloc: Allocator for xv6
11原创 2020-07-18 09:55:21 · 2366 阅读 · 21 评论