和内存不同的是,这个“页表”的级别是自定义的,原始的xv6的表有13项,前12项直接包含文件块的地址,第13项是二级表的地址,二级表包含256项,每项都是文件块的地址,所以单个文件最大为12+256个文件块,为了支持更大的文件,需要将直接包含文件块地址的表项中取一项支持三级表,这样单个文件就可以扩大到11+256+256*...
总结一下,缺页中断的发生时刻应该是在MMU访问到一个PTE_V位为0的PTE时,在xv6中这个PTE的其他位是没有意义的,而在riscv-pk(用在spike模拟器上的代理内核)则让PTE的其他位指向一个标记结构体,里面包含了这个缺页的信息,比如该缺页是否是因为内存被置换到硬盘上了,置换到了哪个位置等信息,这样就使得该系统可以...
MIT 6.828 - 4. Lab 04: Xv6 lazy page allocation 2019-12-20 05:59 −[TOC] # 实验总结 1. 本次实验用时约八个小时。 2. 收获是对线性地址的理解更深入了。 遇到的困难包括: 1. 懒。 2. xv6-riscv 默认开了 kpti(内核和用户态页表分离) ,故需要在各种系统调用头部手动模拟 traverse 页表的过...
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...
MIT-6.S081-2020实验(xv6-riscv64)一:util 实验文档 概述 实验一主要涉及调用系统调用函数,这些系统调用函数基本都是符合POSIX规范的,和操作系统本身关系较小,在调试的时候也可以先把程序在外部的Linux下跑通然后再放进xv6中运行。 内容 sleep 基本没什么特别的内容,按说明的做就行了。
MIT-6.S081-2020实验(xv6-riscv64)六:cow 实验文档 概述 这次实验实现copy on write功能,和上次实验一样也是缺页中断的应用,但不同的是,这次实验涉及的物理内存和虚拟地址的操作要比上个实验多不少,因此难度也更大一些。 内容 首先是uvmcopy的部分,原来的操作是从老页表中获得虚拟地址对应的物理地址,创建一...
这次实验内容比较分散,总体来说难度不是太高。 内容 Backtrace 要求在内核中对程序的调用栈进行遍历,输出每一级调用的返回地址。首先我们分析Riscv的栈帧结构,查看call.asm中main函数的汇编代码: void main(void) { 1c:1141addisp,sp,-161e: e406 sd ra,8(sp)20: e022 sd s0,0(sp)22:0800addi s0,sp...
这次实验主要实现网卡驱动的一部分,文档内容非常长,实际实验不算难,跟着hint就行,但还是需要对整体框架有一定的了解。 内容 发送函数: inte1000_transmit(structmbuf *m){ acquire(&e1000_lock); uint32 index = regs[E1000_TDT];if((tx_ring[index].status & E1000_TXD_STAT_DD) ==0) { ...
这次实验主要涉及多线程编程,和之前的实验不太一样,比较偏向于应用层面,除了任务一外都是在宿主机上编写多线程程序,应该是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小,按照文档的指示是可...