Felix is an experimental operating system for the Intel IA-32 architecture (x86).
It's written completely from scratch in Rust and doesn't use any external dependencies.
This project is part of the work for my bachelor thesis in computer engineering. You can read it here.
Felix running in QEMU:
Felix running on real hardware:
- boots (you don't say!)
- BIOS compatible (also works on UEFI with CSM enabled)
- Global Descriptor Table loading
- Unreal Mode switching (to use 32bit addresses in 16bit Real Mode)
- kernel copying from disk to protected memory
- 32bit Protected Mode switching
- kernel jumping
- Interrupt Descriptor Table loading
- CPU exceptions handler
- Programmable Interrupt Controller driver
- keyboard driver
- ATA disk driver
- FAT16 filesystem file read
- timer interrupt driven CPU scheduler
- prints system call that writes to VGA text buffer
- task manager
- round robin CPU scheduler
Available commands:
- help shows available commands
- ls lists root directory entries
- cat displays content of a file
- test <a,b,c> runs a dummy task
- run loads file as task and adds it to the task list
- ps lists running tasks
- rt removes specified task
- print! macro able to print formatted text to screen
You can download a pre-built image or you can build it by yourself using Docker.
A build is made for every commit.
To download the latest build click on the badge above, then click on the most recent build and download the artifact.
First make sure you have Docker installed. Then:
- Clone the repo
git clone https://github.com/mrgian/felix
- Change dir to repo
cd felix
- Build the image
docker build -t felix-image .
- Run the container
docker run --name felix-container felix-image
- Copy build from container to host
docker cp felix-container:/root/felix/build .
Make sure you have rustup
,mtools
,dosfstools
and fdisk
installed on your system, in any case makefile script
will try to install them for you.
git clone https://github.com/mrgian/felix
cd felix
make all
The final disk image is build/disk.img
make run
Or you can run it on a real x86 computer by copying the disk image to a USB drive using this command: sudo dd if=build/disk.img of=/dev/sdX status=progress
and then booting from USB.
- 22/10/22 - Project start
- 27/01/23 - Bootloader can print to screen
- 31/01/23 - Bootloader can read data from disk to memory
- 01/02/23 - Bootloader can load kernel to memory
- 27/02/23 - Moved to Rust environment using inline assembly
- 01/03/23 - Rewritten kernel loading code in Rust
- 08/03/23 - Implemented println macro
- 20/03/23 - Switch to 32bit protected mode
- 29/03/23 - Basic CPU exception handler
- 30/03/23 - PIC driver
- 06/04/23 - keyboard driver
- 07/04/23 - start working on shell
- 08/04/23 - ATA disk driver
- 09/04/23 - FAT filesystem file read
- 26/04/23 - CPU scheduler
- 13/05/23 - prints system call
- 13/05/23 - println! macro in standard library
- 30/06/23 - multitasking finally working
The following features are planned to be added sooner or later:
- paging
- memory allocator
- VESA video driver
- networking
- SATA AHCI disk driver
- graphical user interface
This project is entirely developed by Gianmatteo Palmieri
Logo design by Veronica Grana