Loading

摘要: #mmap 这个实验个人感觉还是有点难度的,关键要理解mmap这个系统调用的工作原理,关于mmap的相关博文可以参考:https://www.cnblogs.com/huxiao-tee/p/4660352.html 添加系统调用等操作不再赘述。我在defs.h中添加的函数原型如下图 完成sys_m 阅读全文
posted @ 2022-01-18 11:08 Kyoz1 阅读(120) 评论(0) 推荐(0)
摘要: #Memory allocator 为每个CPU设置一个锁和空闲物理页链表 在kinit中初始化所有CPU的锁 修改kalloc,用cpuid获取当前的CPU核心编号,并且获取该CPU的锁。查看该CPU的空闲物理页链表是否为空,若不为空,直接分配一个物理页即可,若为空,则扫描其余CPU核的空闲物理页 阅读全文
posted @ 2022-01-18 11:07 Kyoz1 阅读(60) 评论(0) 推荐(0)
摘要: # Uthread: switching between threads 为每个线程添加一个context结构以用于保存/还原寄存器,这部分可以直接把xv6的context搬过来 thread_yield类似于xv6中的yield,它的作用是把当前的进程设置为RUNNABLE,并调用thread_s 阅读全文
posted @ 2022-01-18 11:06 Kyoz1 阅读(49) 评论(0) 推荐(0)
摘要: #Copy-On-Write 当调用fork创建子进程时,会调用uvmcopy根据父进程的页表把父进程的内存空间拷贝至子进程。修改uvmcopy使此时父子进程共用物理页,并且关闭物理页的PTE_W标志,开启PTE_COW标志便于触发页面错误。代码如下: int uvmcopy(pagetable_t 阅读全文
posted @ 2022-01-18 11:05 Kyoz1 阅读(80) 评论(0) 推荐(0)
摘要: #lazy page allocation 首先修改sbrk系统调用,找到sys_sbrk函数。可以发现此函数增加了用户进程的堆空间并调用growproc分配物理页。由于我们需要实现lazy策略,只让p->sz增加就行了,并不直接分配物理页,而是在缺页中断分配真正的物理页。这里需要注意sbrk的参数 阅读全文
posted @ 2022-01-18 11:05 Kyoz1 阅读(71) 评论(0) 推荐(0)
摘要: #Backtrace 在kernel/riscv.h中添加hints所给的r_fp函数,这个函数的作用是取出s0寄存器的值,该寄存器保存了当前的帧指针。栈帧的布局图如下: 可以看出返回地址和前一个栈帧的帧指针的保存位置是固定的,分别为fp-8和fp-16。 弄懂这个图就很容易写出代码了,首先调用r_ 阅读全文
posted @ 2022-01-18 11:03 Kyoz1 阅读(63) 评论(0) 推荐(0)
摘要: #System call tracing 跟着hints做就可以了,给系统调用trace添加一个系统调用号,并且将函数原型添加到kernel/syscall.h中。 在kernel/proc.h中为proc结构体添加一个int mask成员,mask的32位分别标识是否追踪该位所代表的系统调用。比如 阅读全文
posted @ 2021-11-17 10:29 Kyoz1 阅读(91) 评论(0) 推荐(0)
摘要: 操作系统的强隔离性 Q:为什么不把系统调用实现为一个库?使应用程序可以根据需求定制自身的库? A:如果所有应用程序互相信任且没有错误,协同操作的分时方案是可行的。但是在大多数情况下,应用程序间都是互不信任的并且存在bug,所以需要操作系统实现强隔离性。 Q:强隔离性如何实现? A:操作系统最好禁止应 阅读全文
posted @ 2021-10-22 23:49 Kyoz1 阅读(58) 评论(0) 推荐(0)
摘要: LAB链接:https://pdos.csail.mit.edu/6.S081/2020/labs/util.html #sleep main函数有两个参数argc和argv,其中argc表示命令行参数个数(argument count),argc表示命令行向量(argument vector),比 阅读全文
posted @ 2021-10-02 12:54 Kyoz1 阅读(200) 评论(0) 推荐(0)
7