发布了文章2023-04-09
每个实验我都将实验要求和提示、实现思路和步骤、遇到问题和测试结果记录下来,一方面为了将实验要求和提示翻译后记录下来以便后续研读,另一方面也是为了加深实验中学习到的知识点:
发布了文章2023-04-05
mmap 和 munmap 系统调用允许 UNIX 程序对其地址空间进行详细控制。它们可用于在进程之间共享内存,将文件映射到进程地址空间,以及作为用户级页面错误方案(如课程中讨论的垃圾回收算法)的一部分。在本实验中,你将向 xv6 添加 mmap 和 munmap,重点关注内存映射文...
发布了文章2023-03-28
在此作业中,您将增加 xv6 文件的最大大小。目前 xv6 文件限制为 268 个块,或 268*BSIZE 字节(在 xv6 中 BSIZE 为 1024)。此限制来自这样一个事实,即 xv6 inode 包含 12 个“直接”块号和一个“单间接”块号,它指的是最多可容纳 256 个块号的块,总共 12+256=268 个...
发布了文章2023-03-27
程序 user/kalloctest 强调 xv6 的内存分配器:三个进程增长和缩小它们的地址空间,导致对 kalloc 和 kfree 的许多调用。kalloc 和 kfree 获取kmem.lock 。Kalloctest 打印(作为“#test-and-set”)在acquire中由于尝试获取另一个内核已经持有的锁(用于 kmem 锁和其...
发布了文章2023-03-27
您将使用名为 E1000 的网络设备来处理网络通信。对于xv6(以及您编写的驱动程序),E1000看起来像连接到真实以太网局域网(LAN)的真实硬件。实际上,您的驱动程序将与之通信的 E1000 是 qemu 提供的模拟,连接到 LAN 也由 qemu 模拟。在此模拟 LAN 上,xv6(“客机”...
发布了文章2023-03-24
在本练习中,您将为用户级线程系统设计上下文切换机制,然后实现它。为了帮助您入门,您的 xv6 有两个文件 user/uthread.c 和 user/uthread_switch.S,以及Makefile中用于构建 uthread 程序的规则。uthread.c 包含大部分用户级线程包,以及三个简单测试线程的代码。...
发布了文章2023-03-23
虚拟内存提供某种间接引用:内核可以通过将PTE标记为无效或只读来截获内存引用,从而导致页面错误,也可以通过修改PTE来更改地址含义。计算机系统中有一个说法:任何系统问题都能通过某种间接引用来解决。本实验探讨了一个示例:copy-on-write(COW)fork
发布了文章2023-03-21
RISC-V assembly (easy)问题哪些寄存器保存函数的参数?例如,在main函数对printf的调用中,哪个寄存器保存13?main函数中哪里调用了汇编代码中的f函数和g函数?(编译器可能内联函数)printf位于哪个地址?紧接着在main中跳转到printf之后,寄存器ra中保存的值是什...
发布了文章2023-03-20
创建一个控制跟踪的系统调用trace。需要传入一个整数掩码作为参数,该掩码指定跟踪哪些哪些系统调用。例如,可通过trace (1<<SYS_fork)来跟踪fork系统调用,SYS_fork在kernel/syscall.h中定义。你需要修改内核以实现:当系统调用将要返回时,若它符合设置的掩...
发布了文章2023-03-19
一些操作系统(比如Linux)通过在用户与内核之间只读的一块区域共享数据来加速系统调用。这能消减执行这些系统调用时用户态与内核态切换的开销。为了帮助你们理解如何在页表中插入映射,你的第一个任务是为getpid实现这种优化。
发布了文章2023-03-16
Lab1 Xv6 and Unix utilitiesBoot xv6 (easy)从指定仓库clone代码,然后编译-运行,尝试一部分命令,没问题之后就可以正式开始了!sleep (easy)实验要求实现Unix程序sleep,使程序暂定指定数量的ticks。并将解决方案放在文件user/sleep.c中。一些提示:参考其他代码...
发布了文章2023-03-13
在前几天陆续把webserver的线程池、http处理、日志系统、定时器、mysql连接池、配置识别几个模块的框架代码写好后,今天就正式开始调试了。刚开始遇到了日志文件路径和MySQL初始化两个小问题,但都比较好定位也容易解决,这里不再赘述。要是接下来运行时遇到的http报...
赞了文章2023-03-12
程序员在调试时往往分成两派,一派用debugger另一派用print。至于本人嘛,是一个“机会主义者”,有时用print,有时却改投debugger阵营。