# <img width="40" height="40" alt="red-pepper" src="https://i.ibb.co/mrHH6d1m/pixil-frame-0-4.png" /> pepperOS: "will never be done"
<a href="https://ibb.co/KxbfxmFB"><img src="https://i.ibb.co/GQn8QFcG/pepper.png" alt="pepper" border="0"></a>
## Description

PepperOS is a 64-bit freely-licensed monolithic kernel for x86 processors, with round-robin preemptive scheduling and 4-level paging. See the [manual](docs/MANUAL.md) for more.

## Trying the kernel in QEMU

### Debian-based distributions

First, install the dependencies: `sudo apt install nasm python3 xorriso make qemu-system`

Then, you can get an x86_64 toolchain for compilation. The easiest way to do that on most systems is to install it from Homebrew:

```
brew install x86_64-elf-gcc
```

If you're already on a 64-bit machine (which you probably are), and don't want to install a cross-compiler, you can just override `CC` and `LD` variables in the Makefile, like so:

```
CC := gcc
LD := ld
```

Then, to compile the kernel and make an ISO image file, run: `make`.  
To build the user programs and the initial filesystem, do `make user`.  
To run it with QEMU, do: `make run`.  

## Trying the kernel on real hardware

Compile the kernel and generate an ISO image like described above, then burn the image to a USB stick, `/dev/sdX` being the device name (you can get it using `lsblk`):

```
sudo dd if=pepper.iso of=/dev/sdX
```

## Compilation options

By default, PepperOS is compiled without the following features:

```
UBSAN - undefined behavior sanitization
```

These features can be activated by setting them to "true" at the end of the make command, for example:

```
make UBSAN=true
```

## Writing software for PepperOS

If you want to write software for PepperOS, take a look at the [Software Developer's guide](docs/SOFTWARE.md).

## Thanks

PepperOS wouldn't be possible without the following freely-licensed software:

- the [Limine](https://codeberg.org/Limine/Limine) portable bootloader
- Charles Nicholson's [nanoprintf](https://github.com/charlesnicholson/nanoprintf)
- Mintuski's [Flanterm](https://codeberg.org/Mintsuki/Flanterm) terminal emulator

...and without these amazing resources:

- the [OSDev](https://osdev.org) wiki & forums
- Intel 64 and IA-32 Architectures Software Developer's Manual
- Documentation for the [GNU Compiler Collection](https://gcc.gnu.org/onlinedocs/gcc/)
- dreamos82's [OSDev Notes](https://github.com/dreamportdev/Osdev-Notes/tree/master)
- the [Sortix UBsan hook implementations](https://gitlab.com/sortix/sortix/-/blob/main/libc/ubsan/ubsan.c)
- the [CSC 395](https://curtsinger.cs.grinnell.edu/teaching/2022S/CSC395/kernel/) Kernel Development course from Grinnell College