MIT-6.S081-2020实验(xv6-riscv64)一:util 实验文档 概述 实验一主要涉及调用系统调用函数,这些系统调用函数基本都是符合POSIX规范的,和操作系统本身关系较小,在调试的时候也可以先把程序在外部的Linux下跑通然后再放进xv6中运行。 内容 sleep 基本没什么特别的内容,按说明的做就行了。 #include"kernel/types.h...
trap.c的代码和上次实验几乎一样,就不贴了。 然后是物理内存的处理,为了节省空间,我没有直接用物理地址模4096,而是先将物理地址减掉内核的地址空间,再模4096,因为fork不涉及物理内存,即数组索引为(pa - KERNBASE) >> PGSHIFT,当然代价就是每次进行处理引用计数的时候需要先判断pa必须大于等于KERNBASE,不然内核申请...
uint64handle_page(uint64 va,structproc *p){if(va < (1L<<37) || va >= (1L<<57))return-1;for(inti =0; i <16; i++)if(p->vmas[i].valid && va >= p->vmas[i].addr && va < p->vmas[i].addr + p->vmas[i].length) {intperm = PTE_U;if(p->vmas[i].prot & PR...
总结一下,缺页中断的发生时刻应该是在MMU访问到一个PTE_V位为0的PTE时,在xv6中这个PTE的其他位是没有意义的,而在riscv-pk(用在spike模拟器上的代理内核)则让PTE的其他位指向一个标记结构体,里面包含了这个缺页的信息,比如该缺页是否是因为内存被置换到硬盘上了,置换到了哪个位置等信息,这样就使得该系统可以...
MIT-6.S081-2020实验(xv6-riscv64)九:fs 实验文档 概述 这次实验涉及文件系统,重点是对inode节点的操作。 内容 Large files 这个任务主要目的是支持更大的文件。和内存映射类似,文件系统中也有一个类似“页表”的结构,每个文件(inode)都有自己的一个“页表”,维护自己文件占用的文件块。和内存不同的是,这个“...
这次实验主要涉及多线程编程,和之前的实验不太一样,比较偏向于应用层面,除了任务一外都是在宿主机上编写多线程程序,应该是xv6不支持系统级的多线程。 内容 Uthread: switching between threads 这个任务要求对一个程序填空,这个程序在用户层面实现了多线程的调度。但实际上这个调度和xv6内核的进程调度非常相似。首先是...
However, this scheme does limit the maximum size of a user process to be less than the kernel's lowest virtual address. After the kernel has booted, that address is0xC000000in xv6, the address of the PLIC registers; memlayout.h中CLINT对应的常数是0x2000000,比0xC000000小,按照文档的指示是可...
这次实验主要实现网卡驱动的一部分,文档内容非常长,实际实验不算难,跟着hint就行,但还是需要对整体框架有一定的了解。 内容 发送函数: inte1000_transmit(structmbuf *m){ acquire(&e1000_lock); uint32 index = regs[E1000_TDT];if((tx_ring[index].status & E1000_TXD_STAT_DD) ==0) { ...
MIT-6.S081-2020实验(xv6-riscv64)八:lock 实验文档 概述 这次实验主要涉及锁在内核的应用,没有用到什么特别的理论知识,但是编程的时候陷阱重重,要么资源竞争,要么死锁,和实验三差不多,非常考验耐心和细心。 内容 Memory allocator 这个任务要求给物理内存分配程序重新设计锁,使得等待锁时的阻塞尽量少。可以按CPU...
MIT-6.S081-2020实验(xv6-riscv64)二:syscall 实验文档 概述 实验二主要涉及对系统函数调用过程的理解以及尝试自己手动添加系统调用。首先需要大致了解一下xv6系统调用的过程,这里以fork为例: 根据这个过程,就很容易完成本次实验了。 内容 trace 该实验需要打印其他系统调用的信息。根据上面的分析和文档说明,首先...