Every system call crosses a trust boundary.
The project exposed the contracts between user programs and a small MIPS-style kernel: every pointer, descriptor, process transition, and blocking operation had to be validated across that boundary.
What I owned
I implemented major kernel subsystems in a two-person university project. The teaching harness and shell were provided course infrastructure.
- Process scheduling, process control blocks, fork, exec, exit, and wait.
- System calls and validation at the user-kernel boundary.
- File descriptors, console I/O, dup, dup2, blocking pipes, and semaphores.
- A free-list allocator with coalescing in an earlier course lab.
Key decisions
Validate at the kernel boundary
User pointers and descriptors are untrusted. System-call handlers check them before they reach kernel state.
Block instead of spin
Pipes coordinate readers and writers with semaphores and a circular buffer rather than burning CPU while they wait.
How I tested it
- Process creation and lifecycle behavior.
- Descriptor duplication, console I/O, and pipe blocking semantics.
- Allocator reuse and free-list coalescing in the earlier lab.
Built with: C, MIPS, Processes, Memory, IPC, Semaphores
A note on scope
The repository is private, two-person course work. This page describes my subsystems and separates the earlier allocator lab from the operating-system project.