83 lines
5.1 KiB
Markdown
83 lines
5.1 KiB
Markdown
# Luna
|
|
A very basic POSIX operating system for desktop computers, written mostly in C++ and C. [![Build Status](https://drone.cloudapio.eu/api/badges/apio/Luna/status.svg)](https://drone.cloudapio.eu/apio/Luna)
|
|
|
|
## Another UNIX clone?
|
|
[Yes, another UNIX clone](https://wiki.osdev.org/User:Sortie/Yes_Another_Unix_Clone).
|
|
|
|
## Features
|
|
- x86_64-compatible lightweight [kernel](kernel/).
|
|
- Preemptive multitasking, with a round-robin [scheduler](kernel/src/thread/) that can switch between tasks.
|
|
- [Virtual file system](kernel/src/fs/) with a simple but working [tmpfs](kernel/src/fs/tmpfs/) populated from the initial ramdisk.
|
|
- Can [load ELF programs](kernel/src/ELF.cpp) from the file system as userspace tasks.
|
|
- [System call](kernel/src/sys/) interface and [C Library](libc/), aiming to be mostly POSIX-compatible.
|
|
- Designed to be [portable](kernel/src/arch), no need to be restricted to x86_64.
|
|
- Fully [UTF-8 aware](libluna/include/luna/Utf8.h), **everywhere**.
|
|
- [Thread](libluna/include/luna/Atomic.h) [safety](kernel/src/thread/Spinlock.h) (supposedly).
|
|
- Environment-agnostic [utility library](libluna/), which can be used in both kernel and userspace.
|
|
- Return-oriented [error propagation](libluna/include/luna/Result.h), inspired by Rust and SerenityOS.
|
|
- Build system uses [CMake](CMakeLists.txt).
|
|
|
|
## Setup
|
|
|
|
To build and run Luna, you will need to build a [GCC Cross-Compiler](https://wiki.osdev.org/Why_do_I_need_a_Cross_Compiler) and cross-binutils for `x86_64-luna`. (Yes, Luna is advanced enough that it can use its own [OS-Specific Toolchain](https://wiki.osdev.org/OS_Specific_Toolchain), instead of a bare metal target like `x86_64-elf`. It is the first of my OS projects to be able to do so. The patches for Binutils and GCC are [binutils.patch](tools/binutils.patch) and [gcc.patch](tools/gcc.patch)).
|
|
|
|
You should start by installing the [required dependencies](https://wiki.osdev.org/GCC_Cross_Compiler#Installing_Dependencies).
|
|
|
|
Then, run `tools/setup.sh` to build the toolchain.
|
|
|
|
This script will check whether you have the required versions of the toolchain already setup, and will skip building them if so. (This means that it is used by the build scripts to install the toolchain if it is missing before building, so you could skip running it manually.)
|
|
|
|
Please beware that building GCC and Binutils can take some time, depending on your machine.
|
|
|
|
## Building
|
|
There are a variety of scripts for building Luna.
|
|
|
|
`tools/build.sh` will build the kernel, libc and binaries.
|
|
|
|
`tools/rebuild.sh` will do a full rebuild of the kernel, libc and binaries.
|
|
|
|
`tools/install.sh` will install those to the system root and initial ramdisk.
|
|
|
|
`tools/sync-libc.sh` will install the libc headers to the system root, build libc and install it.
|
|
|
|
`tools/build-iso.sh` will build, install, and make an ISO disk image named Luna.iso.
|
|
|
|
`tools/build-stable-iso.sh` does the same thing as build-iso.sh, but configures the kernel so that the version does not show the commit hash (used for stable versions).
|
|
|
|
`tools/rebuild-iso.sh` will do a clean rebuild, install, and make an ISO disk image.
|
|
|
|
In most cases, you should just use `run.sh`, but if you want to build without running, `build-iso.sh`.
|
|
|
|
## Running
|
|
|
|
You should have [QEMU](https://www.qemu.org/) installed.
|
|
|
|
You can choose between 3 run scripts:
|
|
|
|
`tools/run.sh` is the one you should use in most cases. It will build changed files, install, make an ISO image, and run Luna in QEMU.
|
|
|
|
`tools/rebuild-and-run.sh` will rebuild, install, make an ISO, and run Luna in QEMU.
|
|
|
|
`tools/debug.sh` will run Luna in QEMU with a port open for GDB to connect to. (run `tools/build-debug.sh`, `tools/gdb.sh`, and then `tools/debug.sh` in a separate terminal for an optimal debugging experience)
|
|
|
|
Essentially, since `run.sh` builds the toolchain if it hasn't been built, builds Luna if it hasn't been built, and runs it, you could just checkout this repo, run `run.sh`, and you're done. No need for the other scripts. Those are included for more fine-grained control/building step-by-step.
|
|
|
|
You can pass any arguments you want to the run scripts, and those will be forwarded to QEMU. Example: `tools/run.sh -m 512M -net none -machine q35`.
|
|
|
|
## Prebuilt images
|
|
|
|
Prebuilt ISO images (numbered) for every version can be found at [pub.cloudapio.eu](https://pub.cloudapio.eu/luna/releases).
|
|
|
|
These images are built manually whenever I decide to make a new version, and thus don't reflect the latest changes on the `main` branch.
|
|
|
|
Every hour, my server pulls the latest commits on `main` and builds an hourly ISO image. The ten most recent ones can be found in the [hourly](https://pub.cloudapio.eu/luna/hourly) directory, and [Luna-latest.iso](https://pub.cloudapio.eu/luna/Luna-latest.iso) should always be symlinked to the newest one.
|
|
|
|
These images do reflect the latest changes on the `main` branch, but are obviously less stable. Additionally, an hourly image will be skipped if building the latest commit of the project fails.
|
|
|
|
## Is there third-party software I can use on Luna?
|
|
|
|
Not right now, but hopefully we can start porting some software soon!
|
|
|
|
## License
|
|
Luna is open-source and free software under the [BSD-2 License](LICENSE).
|