diff options
author | Himbeer <himbeer@disroot.org> | 2024-08-01 12:59:30 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-08-01 12:59:30 +0200 |
commit | 017c63d49f4c6fdd2f762dd7d14323fbbdb7775e (patch) | |
tree | 37aba07371d316e63ee8543ba5789dd22ab91639 | |
parent | b2e908aa7a503037ebb95df3860fdb196aacdf30 (diff) |
Remove userinit entirely, directly embedding the init ELF instead
Closes #69.
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | README.md | 23 | ||||
-rw-r--r-- | build.zig | 8 | ||||
-rw-r--r-- | src/kernel.zig | 6 | ||||
-rw-r--r-- | src/lib/process.zig | 23 | ||||
-rw-r--r-- | src/lib/userinit.zig | 5 |
6 files changed, 13 insertions, 55 deletions
@@ -7,5 +7,4 @@ /.zig-*/ /hwi /hwi.o -/src/lib/cfg/userinit/ -/src/lib/cfg/userinit.tar +/src/lib/cfg/init @@ -39,7 +39,7 @@ QEMU can be adapted to use this boot flow as well (the default is different). Required dependencies: * zig ^0.12.0 -* userinit.tar (see below) +* init executable (see below) To make a debug build of this kernel, run: @@ -56,23 +56,14 @@ You can also use any other Zig build mode, e.g. `--release=fast`. This results in a `zig-out/bin/srvre_kernel.elf` file. You may `strip(1)` this file if you want to. -### Create a userinit +### init executable -A userinit is an uncompressed tar file containing an initramfs. -It is embedded into the kernel binary to avoid running drivers in S-mode -as much as possible, meaning that a rebuild is required to apply modifications. -Its directory structure is made available as VFS resources. -On startup, the kernel looks for a file named `init` and attempts to execute it -in U-mode. Example programs are provided in the `examples/` directory. -The file has to be a statically linked ELF executable with program headers. +The init executable is expected to be a statically linked ELF +(with program headers) at `src/lib/cfg/init`. It is embedded in the kernel +binary to avoid running (filesystem) drivers in S-mode, meaning that a kernel +rebuild is required to apply modifications. -The build process expects the tar to exist at `src/lib/cfg/userinit.tar`. -Assuming your directory tree is at `src/lib/cfg/userinit/` you can use -the following command to create the archive: - -``` -tar -C src/lib/cfg/userinit -cvf src/lib/cfg/userinit.tar . -``` +Example programs are provided in the `examples/` directory. ## Build OpenSBI @@ -9,14 +9,6 @@ const std = @import("std"); // declaratively construct a build graph that will be executed by an external // runner. pub fn build(b: *std.Build) void { - const create_userinit = b.addSystemCommand(&.{"tar"}); - create_userinit.addArg("-C"); - create_userinit.addDirectoryArg(b.path("src/lib/cfg/userinit")); - create_userinit.addArg("-cf"); - create_userinit.addFileArg(b.path("src/lib/cfg/userinit.tar")); - create_userinit.addArg("."); - b.getInstallStep().dependOn(&create_userinit.step); - const riscv64_freestanding = std.zig.CrossTarget{ .cpu_arch = std.Target.Cpu.Arch.riscv64, .os_tag = std.Target.Os.Tag.freestanding, diff --git a/src/kernel.zig b/src/kernel.zig index 648946d..b415d17 100644 --- a/src/kernel.zig +++ b/src/kernel.zig @@ -11,7 +11,8 @@ const paging = @import("lib/paging.zig"); const plic = @import("lib/plic.zig"); const process = @import("lib/process.zig"); const riscv = @import("lib/riscv.zig"); -const userinit = @import("lib/userinit.zig"); + +const init = @embedFile("lib/cfg/init"); const Error = error{ HartIdOutOfRange, @@ -166,6 +167,5 @@ fn pagedRun() !noreturn { try w.print("\r\n", .{}); try w.print("Start init process\r\n", .{}); - var userinit_stream = std.io.fixedBufferStream(userinit.tarball); - try process.runInit(allocator, userinit_stream.reader()); + try process.run(allocator, @alignCast(init)); } diff --git a/src/lib/process.zig b/src/lib/process.zig index b59d255..b5afade 100644 --- a/src/lib/process.zig +++ b/src/lib/process.zig @@ -318,27 +318,8 @@ pub fn create(allocator: Allocator, elf_buf: []align(@alignOf(elf.Elf64_Ehdr)) c return &proc_node.data; } -pub fn runInit(allocator: Allocator, reader: anytype) !noreturn { - var file_name_buffer: [4096]u8 = undefined; - var link_name_buffer: [4096]u8 = undefined; - - var it = std.tar.iterator(reader, .{ - .file_name_buffer = file_name_buffer[0..], - .link_name_buffer = link_name_buffer[0..], - }); - const exe = while (try it.next()) |file| { - if (std.mem.eql(u8, file.name, "./init")) { - break file; - } - } else return Error.NoInit; - - const alignment = @alignOf(elf.Elf64_Ehdr); - - var exe_list = std.ArrayListAligned(u8, alignment).init(allocator); - defer exe_list.deinit(); - try exe.reader().readAllArrayListAligned(alignment, &exe_list, exe.size); - - const proc = try create(allocator, exe_list.items); +pub fn run(allocator: Allocator, bytes: []align(@alignOf(elf.Elf64_Ehdr)) const u8) !noreturn { + const proc = try create(allocator, @alignCast(bytes[0..])); try time.interruptInMillis(schedule_interval_millis); switchTo(proc); diff --git a/src/lib/userinit.zig b/src/lib/userinit.zig deleted file mode 100644 index 8c77cdd..0000000 --- a/src/lib/userinit.zig +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org> -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -pub const tarball = @embedFile("cfg/userinit.tar"); |