diff --git a/bootstrap/.gitignore b/bootstrap/.gitignore
new file mode 100644
index 0000000000..ea8c4bf7f3
--- /dev/null
+++ b/bootstrap/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/bootstrap/Cargo.lock b/bootstrap/Cargo.lock
new file mode 100644
index 0000000000..7fcc3f58f0
--- /dev/null
+++ b/bootstrap/Cargo.lock
@@ -0,0 +1,240 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "arrayvec"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+
+[[package]]
+name = "autocfg"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+[[package]]
+name = "bitflags"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
+
+[[package]]
+name = "bootstrap"
+version = "0.0.0"
+dependencies = [
+ "arrayvec",
+ "hashbrown",
+ "linked_list_allocator",
+ "log",
+ "plain",
+ "redox-initfs",
+ "redox-path",
+ "redox-rt",
+ "redox-scheme",
+ "redox_syscall",
+ "slab",
+]
+
+[[package]]
+name = "foldhash"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
+[[package]]
+name = "generic-rt"
+version = "0.1.0"
+source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#696ae4eca1df5e3b76a57f62903ee1a94b9c6aa6"
+
+[[package]]
+name = "goblin"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f27c1b4369c2cd341b5de549380158b105a04c331be5db9110eef7b6d2742134"
+dependencies = [
+ "log",
+ "plain",
+ "scroll",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+dependencies = [
+ "foldhash",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.172"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+
+[[package]]
+name = "libredox"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+dependencies = [
+ "bitflags",
+ "libc",
+ "redox_syscall",
+]
+
+[[package]]
+name = "linked_list_allocator"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286"
+dependencies = [
+ "spinning_top",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+
+[[package]]
+name = "plain"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "redox-initfs"
+version = "0.2.0"
+source = "git+https://gitlab.redox-os.org/redox-os/redox-initfs.git#d0802237d7894881df7ddd338dfc64220d0646ff"
+dependencies = [
+ "plain",
+]
+
+[[package]]
+name = "redox-path"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436d45c2b6a5b159d43da708e62b25be3a4a3d5550d654b72216ade4c4bfd717"
+
+[[package]]
+name = "redox-rt"
+version = "0.1.0"
+source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#696ae4eca1df5e3b76a57f62903ee1a94b9c6aa6"
+dependencies = [
+ "bitflags",
+ "generic-rt",
+ "goblin",
+ "plain",
+ "redox_syscall",
+]
+
+[[package]]
+name = "redox-scheme"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a14f94bc95b388d8f40a61f25577863f1cf151aaf600a5b7778d1a2018ff7742"
+dependencies = [
+ "libredox",
+ "redox_syscall",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.11"
+source = "git+https://gitlab.redox-os.org/redox-os/syscall.git?branch=master#8f646a63ac9c3aa532a37ddfdc136ec19878f0d6"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "scroll"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da"
+dependencies = [
+ "scroll_derive",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "spinning_top"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b9eb1a2f4c41445a3a0ff9abc5221c5fcd28e1f13cd7c0397706f9ac938ddb0"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
diff --git a/bootstrap/Cargo.toml b/bootstrap/Cargo.toml
new file mode 100644
index 0000000000..b41643737a
--- /dev/null
+++ b/bootstrap/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+name = "bootstrap"
+version = "0.0.0"
+authors = ["4lDO2 <4lDO2@protonmail.com>"]
+edition = "2021"
+license = "MIT"
+
+[lib]
+name = "bootstrap"
+crate-type = ["staticlib"]
+
+[dependencies]
+hashbrown = { version = "0.15", default-features = false, features = [
+ "inline-more",
+ "default-hasher",
+] }
+linked_list_allocator = "0.10"
+log = { version = "0.4", default-features = false }
+plain = "0.2"
+redox-initfs = { git = "https://gitlab.redox-os.org/redox-os/redox-initfs.git", default-features = false }
+redox_syscall = { version = "0.5.4", default-features = false }
+redox-scheme = { version = "0.6", default-features = false }
+redox-rt = { git = "https://gitlab.redox-os.org/redox-os/relibc.git", default-features = false }
+redox-path = "0.3.1"
+slab = { version = "0.4.9", default-features = false }
+arrayvec = { version = "0.7.6", default-features = false }
+
+[profile.release]
+panic = "abort"
+lto = "fat"
+
+[profile.dev]
+panic = "abort"
+
+[patch.crates-io]
+redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git", branch = "master" }
diff --git a/bootstrap/LICENSE b/bootstrap/LICENSE
new file mode 100644
index 0000000000..2c457a7229
--- /dev/null
+++ b/bootstrap/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 4lDO2
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this 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.
+
+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/bootstrap/README.md b/bootstrap/README.md
new file mode 100644
index 0000000000..a56ea88e81
--- /dev/null
+++ b/bootstrap/README.md
@@ -0,0 +1,26 @@
+# bootstrap
+
+First code that the kernel executes, responsible for spawning init.
+
+## How To Contribute
+
+To learn how to contribute to this system component you need to read the following document:
+
+- [CONTRIBUTING.md](https://gitlab.redox-os.org/redox-os/redox/-/blob/master/CONTRIBUTING.md)
+
+## Development
+
+To learn how to do development with this system component inside the Redox build system you need to read the [Build System](https://doc.redox-os.org/book/build-system-reference.html) and [Coding and Building](https://doc.redox-os.org/book/coding-and-building.html) pages.
+
+### How To Build
+
+To build this system component you need to download the Redox build system, you can learn how to do it on the [Building Redox](https://doc.redox-os.org/book/podman-build.html) page.
+
+This is necessary because they only work with cross-compilation to a Redox virtual machine, but you can do some testing from Linux.
+
+## Funding - Process Manager (`src/procmgr.rs`)
+
+The _Unix-style Signals and Process Management_ project is funded through [NGI Zero Core](https://nlnet.nl/core), a fund established by [NLnet](https://nlnet.nl) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu) program. Learn more at the [NLnet project page](https://nlnet.nl/project/RedoxOS-Signals).
+
+[
](https://nlnet.nl)
+[
](https://nlnet.nl/core)
diff --git a/bootstrap/src/aarch64.ld b/bootstrap/src/aarch64.ld
new file mode 100644
index 0000000000..cee830f08a
--- /dev/null
+++ b/bootstrap/src/aarch64.ld
@@ -0,0 +1,46 @@
+ENTRY(_start)
+OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
+
+SECTIONS {
+ . = 4096 + 4096; /* Reserved for the null page and the initfs header prepended by redox-initfs-ar */
+ __initfs_header = . - 4096;
+ . += SIZEOF_HEADERS;
+ . = ALIGN(4096);
+
+ .text : {
+ __text_start = .;
+ *(.text*)
+ . = ALIGN(4096);
+ __text_end = .;
+ }
+ .rodata : {
+ __rodata_start = .;
+ *(.rodata*)
+ . = ALIGN(4096);
+ __rodata_end = .;
+ }
+ .data : {
+ __data_start = .;
+ *(.data*)
+ . = ALIGN(4096);
+ __data_end = .;
+
+ *(.tbss*)
+ . = ALIGN(4096);
+ *(.tdata*)
+ . = ALIGN(4096);
+
+ __bss_start = .;
+ *(.bss*)
+ . = ALIGN(4096);
+ __bss_end = .;
+ }
+
+ /DISCARD/ : {
+ *(.comment*)
+ *(.eh_frame*)
+ *(.gcc_except_table*)
+ *(.note*)
+ *(.rel.eh_frame*)
+ }
+}
diff --git a/bootstrap/src/aarch64.rs b/bootstrap/src/aarch64.rs
new file mode 100644
index 0000000000..6e1a732175
--- /dev/null
+++ b/bootstrap/src/aarch64.rs
@@ -0,0 +1,53 @@
+use core::mem;
+use syscall::{data::Map, flag::MapFlags, number::SYS_FMAP};
+
+pub const USERMODE_END: usize = 0x0000_8000_0000_0000;
+pub const STACK_START: usize = USERMODE_END - STACK_SIZE;
+
+const STACK_SIZE: usize = 64 * 1024; // 64 KiB
+static MAP: Map = Map {
+ offset: 0,
+ size: STACK_SIZE,
+ flags: MapFlags::PROT_READ
+ .union(MapFlags::PROT_WRITE)
+ .union(MapFlags::MAP_PRIVATE)
+ .union(MapFlags::MAP_FIXED_NOREPLACE),
+ address: STACK_START, // highest possible user address
+};
+
+core::arch::global_asm!(
+ "
+ .globl _start
+ _start:
+ // Setup a stack.
+ ldr x8, ={number}
+ ldr x0, ={fd}
+ ldr x1, ={map} // pointer to Map struct
+ ldr x2, ={map_size} // size of Map struct
+ svc 0
+
+ // Failure if return value is zero
+ cbz x0, 1f
+
+ // Failure if return value is negative
+ tbnz x0, 63, 1f
+
+ // Set up stack frame
+ mov sp, x0
+ add sp, sp, #{stack_size}
+ mov fp, sp
+
+ // Stack has the same alignment as `size`.
+ bl start
+ // `start` must never return.
+
+ // failure, emit undefined instruction
+ 1:
+ udf #0
+ ",
+ fd = const usize::MAX, // dummy fd indicates anonymous map
+ map = sym MAP,
+ map_size = const mem::size_of::