Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/UltraOS/Hyper
A modern x86/ARM bootloader supporting both BIOS and UEFI
https://github.com/UltraOS/Hyper
aarch64 bios bootloader efi uefi x86 x86-64
Last synced: 3 months ago
JSON representation
A modern x86/ARM bootloader supporting both BIOS and UEFI
- Host: GitHub
- URL: https://github.com/UltraOS/Hyper
- Owner: UltraOS
- License: mit
- Created: 2021-08-31T16:50:37.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2024-08-27T20:38:37.000Z (5 months ago)
- Last Synced: 2024-08-27T21:58:05.975Z (5 months ago)
- Topics: aarch64, bios, bootloader, efi, uefi, x86, x86-64
- Language: C
- Homepage:
- Size: 740 KB
- Stars: 36
- Watchers: 3
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Hyper
A fast & lightweight bootloader for the x86 & ARM architectures.
[![CI](https://github.com/UltraOS/Hyper/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/UltraOS/Hyper/actions/workflows/main.yml)
## Features & Support
Boot sectors for HDD, el-torito & hybrid ISO formats.
Support for ELF binaries targeting I386, AMD64 and aarch64.### Platforms
- BIOS
- UEFI### Partition Layouts:
- GPT
- MBR/EBR
- RAW### File Systems:
- FAT12/16/32
- ISO9660### Boot Protocols:
- [Ultra](https://github.com/UltraOS/UltraProtocol)## Usage
Grab all the files from the latest release, and proceed to the steps below depending on your target.### BIOS boot with MBR/EBR:
1. Create an MBR partitioned image with at least one file system.
2. Run `./hyper_install- ./my-image`.
### UEFI boot with MBR/EBR/GPT:
1. Create an MBR/GPT partitioned image.
2. Create a FAT-formatted EFI system partition.
3. Copy `BOOTX64.EFI` (for x86) or `BOOTAA64.EFI` (for aarch64) to `/EFI/BOOT/` on that partition.### BIOS (+UEFI) boot with ISO hybrid:
1. Create a directory that will be used as the root of the iso image.
2. Copy `hyper_iso_boot` into the directory from step 1.
3. (optionally) for UEFI support:
- Create a raw FAT image with at least a `EFI/BOOT/BOOT{X64,AA64}.EFI` inside that will be used as the ESP.
- Copy the raw image into the directory created in step 1.
4. Create an iso image with the following parameters:
- `hyper_iso_boot` as the el-torito boot record with 4 sectors preloaded & boot information table enabled without emulation.
- (optionally) `` as the EFI el-torito boot option.
5. (optionally) Run `./hyper-install- ./my-image.iso` to make the image bootable as an HDD with BIOS.An example of such command using the `xorriso` utility:
```
xorriso -as mkisofs \
-b \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--efi-boot \
-efi-boot-part --efi-boot-image \
--protective-msdos-label \
-o
```## Configuration & Boot
Hyper loader operates based on the instructions given in the boot configuration file.
The format as well as expected location of the configuration file are described below.
### Location On Disk
The configuration file must be called `hyper.cfg` and contained in one the following paths:
- /hyper.cfg
- /boot/hyper.cfg
- /boot/hyper/hyper.cfgThe loader uses the first configuration file it finds, searching in the aforementioned order.
Currently, configuration files cannot be chained, but it's a planned feature.The file can be contained on any disk & partition as long as it's supported by the loader.
### Format & Syntax
The format of the configuration file somewhat resembles YAML but simplified:
- `#` denotes a comment, which spans the entire line and can contain any characters.
- `x = y` denotes a key/value pair, `x` doesn't have to be unique.
- `x:` denotes an object called `x`, which continues on the next line, and has at least one key/value pair inside.
- `[Name]` denotes a loadable entry with a unique name that the loader can act on depending on the protocol type.The configuration file is predominantly ASCII with some exceptions described below.
Reserved characters are: `[` `]` `:` `=` ` `.
However, these characters are allowed to appear inside quoted values, including
any other characters that are not part of the ASCII set, such as UTF-8 encoded code-points.Value types can be one of the following:
- Integer, both signed & unsigned, including decimal, hex, octal and binary (up to 64 bits).
- Boolean, literal `true`/`false` in any case.
- Null, literal `null` in any case.
- String, both quoted (with `'` or `"`) and unquoted. Please note that string escaping is not supported,
use a combination of `'` with `"` instead.The loader attempts to interpret each value in the aforementioned order,
stopping at the first type that succeeds the conversion.The format relies on whitespace to determine scopes & nesting levels, so it is
expected to be consistent throughout the configuration file.
Every configuration file consists of the following:
- (optionally) Any number of global variables at the top.
- At least one loadable entry, denoting a new scope, which contains at least
the`protocol` key/value pair.Paths are specified using a special format, which is a combination of POSIX and
hyper-specific extensions and must always be absolute.
Leading `/` refers to the disk & partition where the current configuration file was loaded from.Paths can optionally start with prefixes, such as:
- `::/` - same as `/`
- `DISK0::/` - disk 0 treated as unpartitioned media
- `DISK80-PART0::/` - disk 0x80, partition 0
- `DISK3-GPTUUID-E0E0D5FB-48FA-4428-B73D-43D3F7E49A8A::/` - disk 3, GPT partition with this UUID
- `DISKUUID-E0E0D5FB-48FA-4428-B73D-43D3F7E49A8A-GPT2::/` - disk with this UUID, GPT partition 2
- `DISKUUID-E0E0D5FB-48FA-4428-B73D-43D3F7E49A8A-PARTUUID-E0E0D5FB-48FA-4428-B73D-43D3F7E49A8A::/` - disk with this UUID, partition with this UUID
Note that all numbers are specified in hexadecimal.
Disk numbers are assigned as follows:
- For BIOS it's the index of a disk queried via `INT13, AH=48`
- For UEFI it's the index of the handle returned by querying `EFI_BLOCK_IO_PROTOCOL_GUID`An example of a configuration file using the `Ultra` protocol:
```py
# Not necessary, but we specify it for good measure
default-entry = "MyOS"[MyOS]
protocol = ultracmdline = "--some-option --some-option2=true"
binary:
path = "/boot/os.bin"
allocate-anywhere = truemodule:
name = "kmap"
path = "DISK80-PART0::/boot/symbols.bin"module:
type = "memory"
name = "allocator-bootstrap"
# 1M
size=0x100000video-mode:
width=1024
height=768
bpp=32
format=xrgb8888
constraint=at-least
```## Building
1. Run `./build.py` with optional `--platform {bios,uefi}`/`--arch {i686,amd64,aarch64}`, as well as `--toolchain {gcc/clang}` flags*Build scripts assumes that you have cmake & git already installed.*
### Supported systems:
- Linux
- MacOS (x86/aarch64)
- Windows (via WSL)
### Dependencies & Package Managers:
The build script attempts to automatically fetch all the dependencies needed to build
the cross-compiler. This step can be skipped by specifying the `--skip-dependencies` flag.Currently supported package managers:
- apt
- pacman
- brewSupport for other systems/package managers can be trivially added by extending the [BuildUtils](https://github.com/UltraOS/BuildUtils) library.