You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
2.7 KiB
Markdown
44 lines
2.7 KiB
Markdown
# Ownerboot Architecture
|
|
|
|
## Nixpkgs
|
|
|
|
Nixpkgs is organized as a mutually-recursive package collection; the machinery for this involves `lib.makeScope` and `callPackage`.
|
|
|
|
## Ownerboot
|
|
|
|
Ownerboot creates a second mutually-recursive package set containing all of the build products which go into the final flash image; this package set is what you see in `src/default.nix`:
|
|
|
|
* `coreboot` -- a Nix package for coreboot, since it is not in nixpkgs
|
|
* `kernel` -- the Linux kernel, using a custom (non-nixpkgs) expression
|
|
* `userspace` -- the userspace for the linux initramfs
|
|
* `initramfs` -- merges `userspace` with the boot-critical modules from `kernel` and wraps it in a properly-formatted `cpio` archive
|
|
* `arm-trusted-firmware` -- the ARM EL3 privileged routines
|
|
* `fit` -- generates a FIT payload
|
|
* `iasl` -- the Intel ACPI compiler
|
|
|
|
Many of these packages are simply customizations of the corresponding packages in nixpkgs. In spite of this, the ownerboot package set is *not* a scope-extension of any nixpkgs package set, in order to avoid future package name collisions as nixpkgs adds more packages (and present name collisions due to mistakes!).
|
|
|
|
## Cross Compilation
|
|
|
|
Ownerboot is designed for cross-compilation as a first-class citizen. My arm64 laptop is fanless and lightweight but slow; I don't want to use it to build its own bootloader.
|
|
|
|
### Terminology
|
|
|
|
Recall the GCC cross-compilation terminology:
|
|
|
|
* `build`: the platfrom doing the compiling
|
|
* `host`: the platform which runs the result of the compilation
|
|
* `target`: if running the result of the compilation emits code, the platform on which *that* code runs
|
|
|
|
### Package Sets
|
|
|
|
When cross-compiling nixpkgs there will be (at least) two of these mutually-recursive package sets. Ownerboot instantiates them as:
|
|
|
|
* `nixpkgsOnBuildForBuild`: a copy of nixpkgs which executes on the build machine and emits code for the build machine
|
|
* `nixpkgsOnBuildForHost`: a copy of nixpkgs which executes on the build machine and emits code for the host machine
|
|
|
|
The ownerboot package set is host-independent; it contains only the code which is common across all hosts. Several essential inputs (for example, choice of coreboot version) are host-specific. The host-independent package set has `throw "you must provide..."` placeholders for these. If you attempt to build the host-independent package set, you will encounter these thrown exceptions.
|
|
|
|
Each host platform supported by ownerboot applies an overlay (i.e. `overrideScope'`) to the host-independent package set. These overlays must replace all of the `throw` placeholders in order to produce a useful build artifact. There is one entry for each supported host platform near the bottom of `src/default.nix`.
|
|
|