Final Project

Introduction

The main goal is to have fun and explore more advanced O/S topics. You do not have to do novel research. But if you are interested in exploring more adventurous topic as a research, feel free to let us know (mailto:staff).

If you are doing your own project, we’ll grade you on how much you got working, how elegant your design is, how well can you explain it, and how interesting and creative your solution is. We do realize that time is limited, so we don’t expect you to re-write Linux by the end of the semester. Try to make sure your goals are reasonable; perhaps set a minimum goal that’s definitely achievable (e.g., something of the scale of lab 6) and a more ambitious goal if things go well. For teams please no more than four to a team.

Deliverables

  1. Oct 18, 2016: Pre-proposal.
  2. Nov 3, 2016: Proposal.
  3. Dec 1, 2016: First demo day (tentative).
  4. Dec 6, 2016: Second demo day (tentative).
  5. Dec 9, 2016: Final submission.

Project ideas (if you found none)

  • Build a virtual machine monitor that can run multiple guests (for example, multiple instances of JOS), using x86 VM support.
  • Do something useful with the x86 Trusted Execution Technology. For example, run applications without having to trust the kernel. Here is a recent paper on this topic.
  • Do something useful with the hardware protection of Intel SGX. Here is a recent paper using Intel SGX.
  • Make the JOS file system support writing, file creation, logging for durability, etc., perhaps taking ideas from Linux EXT3.
  • Use file system ideas from Soft updates, WAFL, ZFS, or another advanced file system.
  • Add snapshots to a file system, so that a user can look at the file system as it appeared at various points in the past. You’ll probably want to use some kind of copy-on-write (COW) (e.g, btrsf) for disk storage to keep space consumption down.
  • Build a distributed shared memory (DSM) system, so that you can run multi-threaded shared memory parallel programs on a cluster of machines, using paging to give the appearance of real shared memory. When a thread tries to access a page that’s on another machine, the page fault will give the DSM system a chance to fetch the page over the network from whatever machine currently stores.
  • Allow processes to migrate from one machine to another over the network. You’ll need to do something about the various pieces of a process’s state, but since much state in JOS is in user-space it may be easier than process migration on Linux.
  • Implement paging to disk in JOS, so that processes can be bigger than RAM. Extend your pager with swapping.
  • Implement mmap() of files for JOS.
  • Use xfi to sandbox code within a process.
  • Support x86 2MB or 4MB pages.
  • Modify JOS to have kernel-supported threads inside processes. See in-class uthread assignment to get started. Implementing scheduler activations would be one way to do this project.
  • Use fine-grained locking or lock-free concurrency in JOS in the kernel or in the file server (after making it multithreaded). The Linux kernel uses read copy update to be able to perform read operations without holding locks. Explore RCU by implementing it in JOS use it to support a name cache with lock-free reads.
  • Implement ideas from the Exokernel papers, for example the packet filter.
  • Make JOS to have a soft real-time behavior. You will have to identify some application for which this is useful.
  • Make JOS executable on 64-bit CPUs. This includes redoing the virtual memory system to use 4-level pages tables. See reference page for some documentation.
  • Port JOS to a different microprocessor (e.g., ARM). The osdev wiki may be helpful.
  • A window system for JOS, including graphics driver and mouse. See reference page for some documentation. sqrt(x) is an example JOS window system (and writeup).
  • Implement dune to export privileged hardware instructions to user-space applications in JOS.
  • Intel recently announced transactional memory support for its upcoming processors. Implement support for Intel’s TSX in the QEMU emulator. A follow-on project would be to explore the use of Intel TSX primitives in writing concurrent software, such as extending the JOS kernel to use transactional memory.
  • Implement debugging tracing / debugging functionality for JOS by writing a user-level debugger, strace like functionality as well as hardware register profiling (e.g., Oprofile, perf). You can further implement call traces.
  • Perform binary emulation for (static) Linux executables on the top of JOS.
  • Implement a Windows Manager for JOS.
  • Develop benchmark suite on JOS that should stress different subsystems of JOS like memory, io, processes etc. The suite can comprise of micro as well as macro bench-suites.
  • Implement ASLR for JOS.
  • Make Qemu’s debug console for JOS extensible like gdb’s python extension .
  • Implement a DOS emulator for JOS and try to run at least one game.
  • Implement a toy x86 emulator that is sufficient to emulate JOS. You can look at bochs for reference.
  • Implement user-mode-JOS like Usera Mode Linux and try hosting virtual server or even sandboxing an application.
  • jitting xv6/jos (or tcc w/ xv6/jos src)
  • python in ring0