Lab5:COW 实验背景大概就是说我们需要实现 UNIX 中的写时复制技术 (copy on write)。在没有写时复制的系统中,调用 fork() 时,我们会把父进程的所有的内存都拷贝到子进程的空间,自然,这个耗时是巨大且不可接受的。 并且在实际应用中,fork() 时拷贝的大部分内存都时不会被用到的,比如,在 UNIX 中新建一个进程的通常会先调用 fork(),然后调用 exec()。那么原先复制过来的数 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab4:Traps RISC-V assembly (easy)首先,做这个实验前,需要先了解gdb如何调试内核。 编译 xv6 操作系统并运行在 QEMU 模拟器中,并启动 GDB 调试器。 1234$make CPUS=1 qemu-gdb*** Now run 'gdb' in another window.qemu-system-riscv64 -machine virt -bios no 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab3:Page Table Speed up system calls (easy)这个小实验就是要求实现一个不陷入内核的系统调用 ugetpid。当一个进程被创建时,会在进程的地址空间中映射一个只读的内存区域,地址为USYSCALL。这个页面存储的是一个 struct usyscall 的结构体。 12345// memlayout.hstruct usyscall { int pid; // Process 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab2:System Call 写在最前这篇笔记主要记录一下lab2 system call遇到的困难和一些思考,以及在做这个实验要求要看的xv6源码的整理。 Sysinfo (moderate) 实验目的 在这个小实验中,需要实现一个系统调用 sysinfo, 返回系统运行时的一些信息,例如进程的数目,物理内存的多少等。我们需要定义一个sysinfo的结构体,这个结构体中有一些系统运行时的信息。 实验流程 把 $U 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab10:mmap mmap lab这个实验需要我们完成mmap系统调用: 1void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 意思是映射描述符为 fd 的文件,的前 length 个字节到 addr 开始的位置。并且加上 offset 的偏移量(即不从文件的开头映射) 如果 addr 参数为 0 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab1:Unix Utilities Prime这道编程题目是lab1中最难的一个了。我们观察它课程网站上给的算法图示,我们可以知道,第一个进程通过管道不断往子进程写入这些数,然后子进程会特别地接收第一个管道里的数,记为first_num,然后打印这个first_num,因为这个数一定是素数。然后在它后续接收到的数中,判断这个数是否是first_num的整数倍,如果不是,证明它可能是素数,然后它通过管道再向它自己的子进程写入这个数,如 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
LevelDB源码分析9-FilterBlock解析 为什么需要FilterBlockFilter block为SST中一个区块,filter block由多个filter组成,每个data block对应一个filter(但是一个filter可能对应多个data block)。LevelDB在进入data block中查找前会先检查filter,如果filter判断key不在,那么key一定不在这个block中,就不用进入data block查找了 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析7-SSTable(1) sstable首先我们看一下sstable的结构图 文件中的k/v对是有序存储的,并且被划分到连续排列的Data Block里面,这些Data Block从文件头开始顺序存储,Data Block的存储格式代码在block_builder.cc中; 紧跟在Data Block之后的是Meta Block,其格式代码也在block_builder.cc中;Meta Block存储的是F 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析8-SSTable(2) sstable的遍历这一讲主要介绍是如何遍历sstable的,主要介绍迭代器部分。 首先是如何打开一个sstable文件 对于一个sstable文件,我们先读取它的Footer 。然后根据它的Footer 知道这个sstable的metaindex_handle_ 和 index_handle_ 信息,进而就可以解析整个sstable文件。 1234567891011121314151617181 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析6-Block Block上一讲的BlockBuilder是在构建Block用到的结构体,它不提供访问元素的接口,只提供添加entry的一些接口。当我们在SST中构建好Block后,我们需要一些接口,或者是迭代器访问Block中的元素。 12345class Iter;const char* data_;size_t size_;uint32_t restart_offset_; // Offset in da 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析