From 55e7a72e9ca63d82a68a46767db69b10d1abdcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Neuh=C3=A4user?= Date: Mon, 15 Jun 2026 13:26:51 +0200 Subject: [PATCH] docs: update README.md --- .env.example | 2 +- LICENSE | 26 ++++++++++ README.md | 134 +++++++++++++++++++++++++++++++++++++++++------- docs/banner.png | Bin 0 -> 33379 bytes 4 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 LICENSE create mode 100644 docs/banner.png diff --git a/.env.example b/.env.example index 5d171ff..146521d 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,6 @@ KERNEL_NAME=kernel8.img BUILD_PATH=target/aarch64-unknown-none/release -BINARY_NAME=BINARY_NAME +BINARY_NAME=nova TFTP_PATH=/srv/tftp REMOTE_USER=TFTP_HOST_USER REMOTE_HOST=TFTP_HOST_IP diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ef94af2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +MIT NON-AI License + +Copyright (c) 2026, Alexander Neuhäuser + +Permission is hereby granted, free of charge, to any person obtaining a copy of the software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions. + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +In addition, the following restrictions apply: + +1. The Software and any modifications made to it may not be used for the purpose of training or improving machine learning algorithms, + including but not limited to artificial intelligence, natural language processing, or data mining. This condition applies to any derivatives, + modifications, or updates based on the Software code. Any usage of the Software in an AI-training dataset is considered a breach of this License. + +2. The Software may not be included in any dataset used for training or improving machine learning algorithms, + including but not limited to artificial intelligence, natural language processing, or data mining. + +3. Any person or organization found to be in violation of these restrictions will be subject to legal action and may be held liable + for any damages resulting from such use. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 96fdc80..9c1cf7e 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,120 @@ # NovaOS -NovaOS is a expository project where I build a kernel from scratch for a Raspberry PI 3 B+. +![NovaOS banner](docs/banner.png) -## Features +NovaOS is a hobby operating system kernel written in Rust for the Raspberry Pi 3 B+. +It is built as a learning project for low-level systems programming, bare-metal boot flow, and kernel development. -- Delay and sleep ✓ -- UART ✓ -- Switching ELs ✓ -- GPIOs ✓ -- GPIO Interrupts ✓ -- Communicate with peripherals via mailboxes ✓ -- Frame Buffer ✓ -- Heap Memory allocation ✓ -- MMU ✓ -- SVC instructions ~ -- Basic Console over UART ~ -- Multi Applications ~ -- Multi Core -- Dynamic clock speed -- Kernel Independent Applications -- Multiprocessing +## At A Glance + +NovaOS currently includes: + +- UART initialization and logging +- Delay and sleep primitives +- Exception level transitions across EL2, EL1, and EL0 +- GPIO control and interrupt handling +- Peripheral mailbox communication +- Framebuffer drawing primitives +- Heap memory allocation +- MMU initialization and translation table setup + +Work in progress: + +- SVC instruction handling +- Basic UART console improvements +- Multi-application management + +Planned next: + +- Multi-core support +- Dynamic clock speed management +- Kernel-independent applications +- Multiprocessing improvements + +## Project Structure + +- `src/` - kernel source, architecture code, peripherals, interrupts, and runtime +- `workspace/` - supporting crates such as `heap` and `nova_error` +- `tools/` - build, simulation, SD image generation, and deployment scripts +- `firmware_files/` - Raspberry Pi firmware files copied to SD or TFTP +- `link.ld` - linker script for the kernel image + +## Requirements + +You will need: + +- Rust nightly toolchain (`rust-toolchain.toml` pins `nightly`) +- Rust target `aarch64-unknown-none` +- `llvm-objcopy` for generating `kernel8.img` +- `qemu-system-aarch64` for emulation +- `mtools` (`mformat`, `mcopy`) for SD image generation + +Install the Rust target if needed: + +```bash +rustup target add aarch64-unknown-none +``` + +## Build + +Debug image: + +```bash +cd tools +./build_debug.sh +``` + +Release image: + +```bash +cd tools +./build_release.sh +``` + +Both scripts produce a `kernel8.img` under `target/aarch64-unknown-none//`. + +## Run In QEMU + +1. Generate an SD image with firmware files: + +```bash +cd tools +./generate_sd_card.sh +``` + +2. Start the emulator: + +```bash +cd tools +./start_simulator.sh +``` + +For debug mode with the GDB stub enabled (`-S -s`): + +```bash +cd tools +./start_simulator_debug.sh +``` + +## Deploy To Hardware + +Use the TFTP workflow to deploy to a Raspberry Pi: + +1. Copy `.env.example` to `.env` and fill in your values: + - `REMOTE_USER` + - `REMOTE_HOST` + - `TFTP_PATH` + - `BUILD_PATH` + - `BINARY_NAME` + - `KERNEL_NAME` +2. Run: + +```bash +cd tools +./deply_to_hw.sh +``` + +## Notes + +- This is an educational kernel project and is actively evolving. +- Interfaces and boot flow may change as features are added. diff --git a/docs/banner.png b/docs/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..e4697fbd892139867c83c9e137ed9961a348488a GIT binary patch literal 33379 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%0DS^>4aGF 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 literal 0 HcmV?d00001