Systems Programming · Operating Systems · JVM
Completed two distinct projects in C: implementing four core components of an operating system, and building a subset of the Java Virtual Machine.
Implemented four of the main components of an operating system: a shell, a heap allocator, a file system, and a key-value store.
Implemented a Unix shell similar to sh, bash, and zsh. Supported basic commands such as cd, exit, set, and unset, and could handle piping, sequences, redirection, subshells and more, including feeding the output of one command into the input of another.
Implemented a heap allocator similar to jemalloc and tcmalloc. It could request chunks of memory from the OS and place objects inside them, implementing commands such as free, malloc, and realloc, with free able to merge empty chunks so they could be reused by malloc.
Implemented my own driver for a new file system, SFS, loosely based on the FAT filesystem. It supported (sub)directories and files of varying size, along with file and directory navigation, creation, removal, and modification.
Implemented my own remote in-memory key-value store, supporting multiple concurrent clients with SET, GET, and DEL operations. This meant writing a server application, using multiple threads to support parallel clients, and protecting data structures against concurrent access.
Implemented a subset of the Java Virtual Machine (IJVM) in C. Running an IJVM program meant running a binary against a suite of five basic tests and eight advanced tests, plus some bonus tests.
Created the framework and implemented the stack and switch functions, structs, and IJVM functions to build a subset program of the Java Virtual Machine.
Seven of the eight tests expanded on the basic tests, exercising functions that should have already been implemented to make the implementation more advanced. The eighth tested the stack in the overall project.
Implemented a bonus heap allocator and a garbage collector on top of the base implementation, completed for extra points.