摘要:
#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)