Features in 1K LoC OS
In this book, we will implement the following major features:
- Multitasking: Switch between processes to allow multiple applications to share the CPU.
- Exception handler: Handle events requiring OS intervention, such as illegal instructions.
- Paging: Provide an isolated memory address space for each application.
- System calls: Allow applications to call kernel features.
- Device drivers: Abstract hardware functionalities, such as disk read/write.
- File system: Manage files on disk.
- Command-line shell: User interface for humans.
Features not implemented
The following major features are not implemented in this book:
- Interrupt handling: Instead, we will use a polling method (periodically check for new data on devices), also known as busy waiting.
- Timer processing: Preemptive multitasking is not implemented. We'll use cooperative multitasking, where each process voluntarily yields the CPU.
- Inter-process communication: Features such as pipe, UNIX domain socket, and shared memory are not implemented.
- Multi-processor support: Only single processor is supported.
Source code structure
We'll build from scratch incrementally, and the final file structure will look like this:
├── disk/ - File system contents
├── common.c - Kernel/user common library: printf, memset, ...
├── common.h - Kernel/user common library: definitions of structs and constants
├── kernel.c - Kernel: process management, system calls, device drivers, file system
├── kernel.h - Kernel: definitions of structs and constants
├── kernel.ld - Kernel: linker script (memory layout definition)
├── shell.c - Command-line shell
├── user.c - User library: functions for system calls
├── user.h - User library: definitions of structs and constants
├── user.ld - User: linker script (memory layout definition)
└── run.sh - Build script
In this book, "user land" is sometimes abbreviated as "user". Consider it as "applications", and do not confuse it with "user account"!