Snow OS is a 64-bit cooperative multi-tasking operating system implemented in C. In short, it supports memory management, paging, context switching, terminal, shell and file management for tarfs.
The project was completed as a part of the graduate course CSE 506 Operating Systems by Prof. Mike Ferdman at Stony Brook University in Fall '17.
- Memory Subsystem (page descriptors, free list, virtual memory, page tables, kmalloc)
- Process Subsystem (kernel threads, context switch)
- User-level Subsystem (VMAs/vm_map_entrys, switch to ring 3, page faults)
- COW fork(), auto-growing stack, dynamic heap allocation, graceful SEGV
- I/O subsystem (syscalls, terminals, VFS, tarfs file access, elf loading)
- tarfs: open, read, close, opendir, readdir, closedir
- Terminal: read(stdin), write(stdout), write(stderr)
- Virtual File System
- kprintf, IDT, keyboard, timer interrupts
- Shell with PATH, PS1, cd, and &
- Script handling with shebang (#!)
- bin/init user process to launch shell using /etc/rc
- Reaper/Idle process to cleanup zombie processes
- Reused PIDs
- Binaries implemented: init, echo, sleep, cat, ls, kill -9, ps
- Background processes
- Runs its own Shell
cd: change current working directory
echo <input>: print the given input
export PATH=<_path>: update path variable with _path
export PS1=<_ps1>: update PS1 variable with _ps1
ls: list the current directory contents
ps: list all process in the OS
sleep: sleep for given input time in seconds
kill -9: kills the process with given pid
cat <file>: prints the given file content
./<binary_file>: execution of binary file with name binary_file
<command> &: execution of background process
make clean
make
qemu-system-x86_64 -curses -drive id=boot,format=raw,file=$USER.img,if=none -drive id=data,format=raw,file=$USER-data.img,if=none -device ahci,id=ahci -device ide-drive,drive=boot,bus=ahci.0 -device ide-drive,drive=data,bus=ahci.1 -gdb tcp::9999
ls
cat /etc/test.txt
.//etc/test.sbush
sbush /etc/test.sbush
ls /etc
ps
echo hello
export PS1=SHELL
Under the rootfs/etc/ folder, the following test files can be found:
- test: test directory for cd
- test.txt: simple text file for cat
- test.sbush: simple sbush script
- stress_test.sbush: stress test sbush script with 60 commands to spawn 60 processes, system remains stable
chdir
close
closedir
execvpe
exit
fork
free
getcwd
getpid
getppid
kill
malloc
open
opendir
ps
read
readdir
sleep
wait
waitpid
write
yield
Ankit Aggarwal
Saraj Munjal