# Ethereal
A custom all-in-one operating system, written for speed, memory conservation, and reliability.\
Formerly known as reduceOS
## What is Ethereal?
Ethereal is a project with the goal of creating a fully functional OS from scratch with all components a modern OS would have.
Currently, the project is developing its usermode stages.
## Screenshots
\
*Modern, 1080p desktop environment*
\
*Ethereal older main desktop environment with DOOM*
\
*Ethereal booting in debug mode*
\
*Ethereal on Libera chat (#ethereal)*
\
*Ethereal running DOOM*
\
*Ethereal running a neofetch clone made for it (whatarewe)*
## Features
- Full SMP-enabled kernel
- Custom window manager (Celestial)
- USB support for UHCI/EHCI/xHCI controllers
- AHCI/IDE support
- Networking stack with E1000 and RTL8139 network card driver
- Priority-based round-robin scheduler with a well-tested API
- Support for the `mlibc` C library and its wide variety of functions
- Full ACPI support with the ACPICA library (with backup MinACPI library that doesn't have AML parsing)
## Project structure
- `base`: Contains the base filesystem. Files in `base/initrd` go in the initial ramdisk (for non LiveCD boots) and files in `base/sysroot` go in sysroot.
- `buildscripts`: Contains buildscripts for the build system
- `conf`: Contains misc. configuration files, such as architecture files, GRUB configs, extra boot files, etc.
- `drivers`: Drivers for Hexahedron, copied based on their configuration.
- `external`: Contains external projects, such as ACPICA. See External Components.
- `hexahedron`: The main kernel project
- `libkstructures`: Contains misc. kernel structures, like lists/hashmaps/parsers/whatever
- `libc`: Contains mlibc
## Building
### ACPICA notice
If you use ACPICA (it is on by default), you must download the tarfile from [here](https://downloadmirror.intel.com/834974/acpica-unix-20240927.tar.gz) and extract it to `external/acpica/acpica-src`
Else, you can edit `conf/build/.mk` and set `USE_ACPICA` to 0.
### Building
To build Ethereal, you will need an Ethereal toolchain for your target architecture.\
The Ethereal toolchain can be found at [the repository](https://github.com/sasdallas/Ethereal-Toolchain)
Other packages required: `grub-common`, `xorriso`, `qemu-system`, `meson`, `ninja`
Edit `buildscripts/build-arch.sh` to change the target build architecture. \
Running `make all` will build an ISO in `build-output/ethereal.iso`
Currently, Ethereal's lack of filesystem drivers means that LiveCD boots are usually the best option.\
The initial ramdisk in a LiveCD is the sysroot, and if the OS detects the boot it will copy the initial ramdisk into RAM.
## Kernel arguments
A lot of times, Ethereal fails to load. This is expected. Please start a GitHub issue.
You can solve some problems by using 'e' to open a GRUB configuration and adding some kernel arguments to the end of the `multiboot entry`.\
Here is a small list:
- `--debug=`: Options are `console` and `none`. If `console`, will redirect kernel debug output to the screen. Useful for debugging
- `--noload=`: Comma-separated list of driver (.sys) files to not load. Problematic drivers: usb_xhci.sys, ahci.sys, ps2.sys (if you don't support PS/2),
- `--no-acpica`: Disable the ACPICA library and fallback to MinACPI implementation. Only useful in extreme cases.
- `--no-acpi`: Disable all ACPI implementations. Disables SMP as well.
- `--disable-smp`: Enable ACPI, but disable SMP
- `--disable-cow`: Disable copy-on-write. Not recommended, but can be useful in extreme cases.
- `--no-psf-font`: Don't load the PSF font from initrd
## External components
Certain external components are available in `external`, `libc`, and other parts of the kernel. Here is a list of them and their versions:
- ACPICA UNIX* (Intel License): Version 20240927 [available here](https://www.intel.com/content/www/us/en/developer/topic-technology/open/acpica/download.html)
- libmusl math library (MIT License): [available here](https://github.com/kraj/musl)
- freetype (GPL license): [available here](https://sourceforge.net/projects/freetype/)
- mlibc (MIT license): [Ethereal fork available here](https://github.com/sasdallas/mlibc)
- tinf (zlib license): [available here](https://github.com/jibsen/tinf/)
- json-parser (BSD 2-clause license): [available here](https://github.com/json-parser/json-parser)
- PlutoSVG (MIT license): [available here](https://github.com/sammycage/plutosvg)
## Credits
A lot of Ethereal's design was inspired by [ToaruOS by klange](https://github.com/klange/ToaruOS) - thank you!
Ethereal's virtual memory manager design and other parts was inspired by [Astral by @mathewnd](https://github.com/mathewnd/Astral)
Some code from Astral was also used, credited where appropriate. A license file is included in `external/`.
The Ethereal logo and Mercury theme were designed by the artist [ArtsySquid](https://artsycomms.carrd.co)
## Licensing
Hexahedron and all other non-external components of Ethereal fall under the terms of the BSD 3-clause license (available in LICENSE).\
All files, unless specified in the copyright header, fall under this license. Any file without a copyright header is NOT protected by BSD 3-clause.
**LICENSING ISSUES:** If a file is found without proper commenting, immediately contact me (preferably through a public channel such as GitHub issues for transparency) directly to resolve it.
Ethereal's goal has **NEVER** been to take code, but it has happened in the past. Please contact me!