文章列表

# Large files 增加对大文件的支持。原本系统中的一个目录表只有 12 个 direct inode 和 1 个 indirect inode,可存储的最大容量为 12+256 个 blocks,增加双重 indirect inode 后可扩容至 11+256+256*256 个 blocks。 原本一个 inode 目录支持 12 个直接 data 和一个 indirect 指针,为了给双重指针留出位置,需要减少一个直接 data。 //kernel/fs.h#define NDIRECT 11 //-1#define NINDIRECT (BSIZE /...

# Implement copy-on-write fork 大意是子进程和父进程共享物理内存,只有需要对共享页写操作时再分配新的自己的物理页。 根据提示,为了区分当前页面是否是 copy-on-write 页面,在 riscv.h 中设置 PTE 保留的第 8 位作为标志。 #define PTE_C (1L << 8) // copy-on-write修改 kalloc.c 如下: int ref[PHYSTOP/PGSIZE+1];// 物理页面的引用计数//...voidfreerange(void *pa_start, void *pa_end)//...

# Backtrace 大意是需要跟踪函数调用轨迹,根据栈的结构: 可以得出,用户态函数调用栈从高地址向低地址增长。栈帧指针 fp 向下 8 个字节是返回地址,向下 16 个字节指向调用者的栈。只要顺着调用者的栈不断向下查找就能输出完整的调用轨迹。 由于每个栈分配一个对齐的页,所以通过判断 fp 在不在当前页范围内就能知道有没有追踪到底。 voidbacktrace(void){ printf("backtrace:\n"); uint64 fp=r_fp(); uint64 up = PGROUNDUP(fp); uint64 down =...

# Speed up system calls 将常用的系统数据保存在用户空间的页表中,这样就不用每次使用系统调用来获取了。lab 中已经定义好了 USYSCALL 的宏和结构体,内容就是一个 pid,可以直接拿来用。 仿照 trapframe 的分配方法,将 usyscall 分配一下: static struct proc*allocproc(void){ // ... // Allocate a trapframe page. if((p->trapframe = (struct trapframe *)kalloc()) == 0){...

# sleep Implement a user-level sleep program for xv6, along the lines of the UNIX sleep command. Your sleep should pause for a user-specified number of ticks. A tick is a notion of time defined by the xv6 kernel, namely the time between two interrupts from the timer chip. Your solution should be in...

# OverView Bustub 的整体架构如下,之前的 p1 和 p2 实现的都是局部功能,p3 要求把前面的模块串起来,真正实现 SQL 执行的全过程。 课程中介绍的一条 SQL 语句的执行过程如下。 从语句生成语法树的过程这里不涉及,可以采用开源的工具实现。Binder 的作用是将 AST 的词语绑定到语法树上生成 Bustub 可以理解的树,Planner 会遍历生成的树产生执行计划树,例如这条 SQL。 SELECT t1.y, t2.x FROM t1 INNER JOIN t2 ON t1.x = t2.y; Optimizer...

# Query ​ 查询部分较为简单,总体思路是:先获取头表 header_page,然后获取树根 root_page,再用树根不断变换成内结点,最后找到叶结点的相应位置。在每个结点内部只要写一个二分查找就行。 INDEX_TEMPLATE_ARGUMENTSauto BPLUSTREE_TYPE::Find(const InternalPage *page, const KeyType &key) -> int { int l = 0; int r = page->GetSize() - 1; while (l < r)...

​ 做的版本是 2023 Spring # LRU-K ​ 官方给的数据结构中,页面的访问放在 LRUKNode 这个类中,与页面形成一对一的关系,但是在实际操作的时候不太习惯,于是改为传统实现方式。需要一个历史队列记录访问次数 <k 的页面 id 和一个缓存队列记录访问次数> k 的页面 id,这两个队列都再加一个 map 提高查找效率。没有使用到 LRUKNode 类,因此也不需要时间戳,如果后续考虑锁细粒度优化,可能会用上 hh。 ​ 在具体使用 list...

# 环境配置 # 一、Gemmini 环境配置 # 1. 配置 Chipyard 环境: 根据安装提示,必须在 linux 中进行。第一次没注意,使用 windows 结果卡在 “Collecting package metadata”。 由于 conda 和 git 之前已经安装过,现在只要安装 conda-lock。执行 “./build-setup.sh riscv-tools” 指令后会有漫长的等待。 中途虚拟机磁盘容量不足了,不得不再来一次。直接在 VMware 设置扩容是不够的,还要在虚拟机中设置文件分区大小。 建议磁盘空间 50G 以上! 报错:./build-setup.sh...

# 计算机系统基础:lab 3 # Buf Bomb # 3.1 实验概述 实验目的:介绍加深对 IA-32 函数调用规则和栈帧结构的理解 实验环境:Linux 实验语言:c # 3.2 实验内容 本实验的主要内容是对一个可执行程序 “bufbomb” 实施一系列缓冲区溢出攻击,也就是设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。本实验需要熟练运用 gdb、objdump、gcc 等工具完成。实验中需要对目标可执行程序 BUFBOMB 分别完成 5 个难度递增的缓冲区溢出攻击。 # 3.2.1 阶段...