二叉树Part06
530.二叉搜索树的最小绝对差 思路 把遍历到的节点都加入vec中,在互减得出答案。 题解 递归法 好久没写,手生了,第一次写成前序遍历了,没有利用到二叉搜索树的特性(中序遍历时是从小到大的) class Solution { private: std::vector<int> vec;…
6.S081|Lab9-Mmap
通过内存映射文件的方式加快访问速度。 感觉初见提示和之前的speed up系统调用有点相似,需要在内存中找到一块地方做映射。 首先我们要注册系统调用。将以下代码添加进user/user.h中。 void* mmap(void *addr, uint64 length, int prot, int f…
6.S081|第五章-中断与设备驱动
关于console的疑惑 我们知道当UART的缓冲区已满的时候,系统会sleep程序直到缓冲区里的东西被消费。于是我们开始疑惑,难道console只能输入不超过128(buffer),尝试了一下还真是,于是疑惑,为什么console的输出能超过128(因为报错的时候通常会打印很多字符)。 其实是因为…
6.S081|第三章-页表
页式硬件 RISCV里执行的指令中的地址都是使用的虚拟地址(Q:为什么要用虚拟地址?A:为了隔离性和保护性),但是机器的物理内存是由物理地址索引的,所以我们需要一种映射机制来完成由虚拟地址到物理地址的转换。 在开始下面内容之前,我们需要知道xv6的内存管理机制是Sv39 RISC-V,这意味着我们只…
6.S081|Lab8-File-system
概念引入 xv6的文件系统分为七层,自底向上的顺序是硬盘(Disk),缓冲区高速缓存(Buffer cache),日志(Logging),索引节点(Inode),目录(Directory),路径名(Pathname),文件描述符(File descriptor)。 inode inode是一个文件或…
6.S081|Lab5-Copy-on-Write Fork for xv6
Implement copy-on write (hard) cow(写时复制)机制不难,但是细节真的很容易出错TwT。不过做完这个lab也是收获满满,对虚拟内存的认识直接跨了一大步。 首先来介绍一下写时复制(copy on write)技术,懒得自己写了,直接摘抄大佬们的文章。 以下来自tzyt …
6.S081|Lab4-Traps
RISC-V assembly 以下内容摘自知乎用户rocketeerli 首先,执行 make fs.img 指令,进行编译。然后查看生成的 user/call.asm 文件,其中的 main 函数如下: 这部分没有需要写的代码,主要根据这个编译生成的代码,回答几个问题。 这里直接按照中文翻译了。…
6.S081|Lab3-Page tables
Speed up system calls (easy) 目标是在用户空间和内核间共享一块只读的区域,这样内核执行SYSCALL的时候就不需要来回跑。当每个进程被创立的时候,都会在USYSCALL区域映射一块只读的分页,这里面存了一个结构体usyscall用来存储当前进程的pid。 提示让我们先看k…
6.S081|Lab2-System call
System call tracing(moderate) 没有特别卡住,可以参考网上别人的实现 Sysinfo(moderate) memory part 阅读题目可知,我们需要知道空闲内存和进程数量,并且提示我们前往kernel/kalloc.c添加一个获取空闲内存量的函数,于是推断关于内存分配…
6.S081|Lab2-系统调用流程
系统调用过程当中有几个关键技术点: 系统调用号:用户程序通过指定一个系统调用号来告诉操作系统应该执行哪个系统调用。xv6中使用a7寄存器来传递这个调用号。 系统调用指令:指定系统调用号以后,用户程序执行系统调用指令,该指令会提升特权级只内核态,保存用户程序执行的上下文,然后跳到内核的处理系统调用的代…