The goal of the project is to have fun and explore more advanced systems topics.
You have two options:
- Finish one of the following labs: mmap, net.
- Work on a project of your choice that involves xv6.
It must be of the same scope as the above options or larger.
See a list of suggested project ideas below.
Important dates
- Nov 2: submit a proposal. The content of the proposal should be
either simply “lab mmap”/”lab net”
or one paragraph describing what you plan to work on your own project.
Please include the names of your team members in the proposal.
Everyone needs to sign up for a group on Canvas to receive a grade.
Each group needs to submit only one copy.
- Dec 6–10: demo in class. See the schedule here.
- Dec 14: submit your code and a write-up in PDF (up to two pages); in the write-up,
describe the problems/project and why you chose them,
challenges you faced (if any), your solution,
and anything interesting that you would like to share.
Ideas
If you are doing your own project, try to make sure your goals are
reasonable; perhaps set a minimum goal that’s definitely achievable
and a more ambitious goal if things go well.
Here’s a list of ideas to get you started thinking.
Feel free to pursue your own ideas.
- Change the system-call interface of xv6 to be compatible with that of Linux.
You should be able to run the same user binaries on both xv6 and Linux.
- Replace the hardcoded memory layout (
kernel/memlayout.h
) using the
device tree
mechanism (e.g., through libfdt).
- Rewrite the xv6 kernel or user-space programs
in Go or Rust.
You may need to add necessary runtime support for programs written in these languages.
- Build a hypervisor that can run multiple xv6 instances.
The hypervisor may run in either M-, S-, or HS-mode.
Check the RVirt hypervisor.
- Implement more virtio
drivers.
For example, you can replace the file system using
virtio-fs,
or use the virtio entropy device for
/dev/random
.
- Replace the virtio disk driver in xv6 with an
NVMe driver
(e.g., JOS from past 451).
- Add container support to xv6
(e.g., Project Payload from CSE 481A).
- Implement software enclaves, using ideas from
Komodo,
Keystone,
Nitro Enclaves,
or the security monitors in Serval.
- Implement ideas (e.g., packet filter) from the papers on
exokernels,
proof-carrying code,
or Jitterbug.
- Use file system ideas from soft updates, journaling, copy-on-write, LFS,
or another advanced file system.
- Do something interesting with processor trace on RISC-V or OpenTitan.
- Implement a window system
(e.g., JOS
from past 451)
or a VNC server
(e.g., vncd in Hyperkernel).
- Write a RISC-V emulator in JavaScript to boot xv6 in the browser
(see JSLinux),
using D3 or Vega to visualize
parts of the system (e.g., memory, traps).
- Do something interesting with Selfie,
for example, by choosing a different subset of RISC-V or implementing more applications.
- Extend some of the challenges in labs.