From 6829ef55fc39301087ea8644729e2412147a710a Mon Sep 17 00:00:00 2001 From: shibedrill Date: Thu, 13 Mar 2025 00:28:50 -0400 Subject: [PATCH] Reorganize, process capabilities --- Cargo.lock | 62 +++++++++++++++++++- Cargo.toml | 9 +-- Makefile | 43 +++++++++----- README.md | 2 +- build.rs | 4 +- limine.conf | 4 +- src/{ => kernel}/arch/aarch64/asm.rs | 0 src/{ => kernel}/arch/aarch64/display.rs | 0 src/{ => kernel}/arch/aarch64/linker.ld | 0 src/{ => kernel}/arch/aarch64/mod.rs | 0 src/{ => kernel}/arch/loongarch64/asm.rs | 0 src/{ => kernel}/arch/loongarch64/display.rs | 0 src/{ => kernel}/arch/loongarch64/linker.ld | 0 src/{ => kernel}/arch/loongarch64/mod.rs | 0 src/{ => kernel}/arch/mod.rs | 0 src/{ => kernel}/arch/riscv64/asm.rs | 0 src/{ => kernel}/arch/riscv64/display.rs | 0 src/{ => kernel}/arch/riscv64/linker.ld | 0 src/{ => kernel}/arch/riscv64/mod.rs | 0 src/{ => kernel}/arch/x86_64/acpi.rs | 0 src/{ => kernel}/arch/x86_64/asm.rs | 0 src/{ => kernel}/arch/x86_64/display.rs | 0 src/{ => kernel}/arch/x86_64/linker.ld | 0 src/{ => kernel}/arch/x86_64/mod.rs | 0 src/{ => kernel}/boot.rs | 4 +- src/{ => kernel}/log.rs | 0 src/{ => kernel}/main.rs | 16 ++--- src/{ => kernel}/memory.rs | 0 src/{ => kernel}/panic.rs | 0 src/{ => kernel}/params.rs | 0 src/{ => kernel}/process.rs | 27 +++++++++ src/{ => kernel}/resources.rs | 0 32 files changed, 134 insertions(+), 37 deletions(-) rename src/{ => kernel}/arch/aarch64/asm.rs (100%) rename src/{ => kernel}/arch/aarch64/display.rs (100%) rename src/{ => kernel}/arch/aarch64/linker.ld (100%) rename src/{ => kernel}/arch/aarch64/mod.rs (100%) rename src/{ => kernel}/arch/loongarch64/asm.rs (100%) rename src/{ => kernel}/arch/loongarch64/display.rs (100%) rename src/{ => kernel}/arch/loongarch64/linker.ld (100%) rename src/{ => kernel}/arch/loongarch64/mod.rs (100%) rename src/{ => kernel}/arch/mod.rs (100%) rename src/{ => kernel}/arch/riscv64/asm.rs (100%) rename src/{ => kernel}/arch/riscv64/display.rs (100%) rename src/{ => kernel}/arch/riscv64/linker.ld (100%) rename src/{ => kernel}/arch/riscv64/mod.rs (100%) rename src/{ => kernel}/arch/x86_64/acpi.rs (100%) rename src/{ => kernel}/arch/x86_64/asm.rs (100%) rename src/{ => kernel}/arch/x86_64/display.rs (100%) rename src/{ => kernel}/arch/x86_64/linker.ld (100%) rename src/{ => kernel}/arch/x86_64/mod.rs (100%) rename src/{ => kernel}/boot.rs (79%) rename src/{ => kernel}/log.rs (100%) rename src/{ => kernel}/main.rs (76%) rename src/{ => kernel}/memory.rs (100%) rename src/{ => kernel}/panic.rs (100%) rename src/{ => kernel}/params.rs (100%) rename src/{ => kernel}/process.rs (57%) rename src/{ => kernel}/resources.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 12ca689..c4e198c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,26 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" +[[package]] +name = "enumflags2" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "flagset" version = "0.4.6" @@ -72,9 +92,10 @@ checksum = "875488b8711a968268c7cf5d139578713097ca4635a76044e8fe8eedf831d07e" [[package]] name = "gila" -version = "0.2.2" +version = "0.2.3" dependencies = [ "acpi", + "enumflags2", "flagset", "limine", "once_cell", @@ -85,9 +106,9 @@ dependencies = [ [[package]] name = "limine" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca87cab008b8efeebdbe037cd4d1438037d48c5cb6fed939ffa5aa06315a321" +checksum = "6e6cb7fd182815ec1ea9e26061418ac37c3eebea47a14e773c563533f277bcef" dependencies = [ "bitflags 2.9.0", ] @@ -133,6 +154,24 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +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 = "rustversion" version = "1.0.20" @@ -163,6 +202,17 @@ 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 = "talc" version = "4.4.2" @@ -172,6 +222,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + [[package]] name = "vga" version = "0.2.9" diff --git a/Cargo.toml b/Cargo.toml index dffd4d3..1e4d335 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "gila" -version = "0.2.2" +version = "0.2.3" edition = "2024" [dependencies] acpi = "5.1.0" +enumflags2 = "0.7.11" flagset = "0.4.6" -limine = "0.3.1" +limine = "0.4.0" once_cell = { version = "1.20.3", default-features = false, features = ["alloc", "critical-section"] } spin = "0.9.8" talc = "4.4.2" @@ -15,8 +16,8 @@ talc = "4.4.2" vga = "0.2.9" [[bin]] -name = "gila" -path = "src/main.rs" +name = "kernel" +path = "src/kernel/main.rs" test = false doctest = false bench = false diff --git a/Makefile b/Makefile index b33a344..aa6d176 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ LIMINEDIR ?= "/usr/share/limine" # QEMU system is set accordingly and automatically qemu = "qemu-system-x86_64" # List of required BIOS files -limine-files = limine-bios.sys limine-bios-cd.bin limine-bios-uefi-cd.bin +limine-files = limine-bios.sys limine-bios-cd.bin limine-bios-uefi-cd.bin BOOTX64.EFI BOOTIA32.EFI BOOTAA64.EFI BOOTLOONGARCH64.EFI BOOTRISCV64.EFI # Properly set QEMU command ifeq ($(TARGET),x86_64-unknown-none) @@ -24,7 +24,7 @@ endif executables = rustup xorriso limine $(qemu) -all: gila iso run +all: kernel iso run checkenv: @@ -42,37 +42,50 @@ prepare: checkenv rustup target add $(TARGET) # Run the ISO in an emulator. -run: build/gila.iso +run: iso $(qemu) -drive file=build/gila.iso,format=raw,index=0,media=disk # Build the bootable kernel image. -.PHONY: build/iso/gila -gila: prepare $(shell find src -type f -name *.rs) $(shell find src -type f -name linker.ld) +.PHONY: build/kernel +kernel: prepare $(shell find src/kernel/ -type f -name *.rs) $(shell find src/kernel/ -type f -name linker.ld) - mkdir -p build/iso/ - cargo build --release -Z unstable-options --target=$(TARGET) --artifact-dir build/iso/ + cargo build --bin kernel --release -Zunstable-options --artifact-dir=build # Build a bootable ISO and install Limine. .PHONY: build/gila.iso -iso: build/iso/gila limine.conf +iso: kernel limine.conf - mkdir -p build/iso/limine + mkdir -p build/iso/boot/limine mkdir -p build/iso/EFI/BOOT + # Copy Limine files cp ./limine.conf build/iso/ - cp $(LIMINEDIR)/limine-bios.sys build/iso/limine/ - cp $(LIMINEDIR)/limine-bios-cd.bin build/iso/limine/ - cp $(LIMINEDIR)/limine-uefi-cd.bin build/iso/limine/ + cp $(LIMINEDIR)/limine-bios.sys build/iso/boot/limine/ + cp $(LIMINEDIR)/limine-bios-cd.bin build/iso/boot/limine/ + cp $(LIMINEDIR)/limine-uefi-cd.bin build/iso/boot/limine/ + cp $(LIMINEDIR)/BOOTX64.EFI build/iso/EFI/BOOT/ + cp $(LIMINEDIR)/BOOTIA32.EFI build/iso/EFI/BOOT/ + cp $(LIMINEDIR)/BOOTAA64.EFI build/iso/EFI/BOOT/ + cp $(LIMINEDIR)/BOOTLOONGARCH64.EFI build/iso/EFI/BOOT + cp $(LIMINEDIR)/BOOTRISCV64.EFI build/iso/EFI/BOOT - tree build/iso/ + # Copy kernel + mv build/kernel build/iso/boot/ - xorriso -as mkisofs -b limine/limine-bios-cd.bin -no-emul-boot \ + # Build filesystem tree + mkdir -p build/iso/system/bin + mkdir -p build/iso/system/tmp + mkdir -p build/iso/system/cfg + + xorriso -as mkisofs -b boot/limine/limine-bios-cd.bin -no-emul-boot \ -boot-load-size 4 -boot-info-table --efi-boot \ - limine/limine-uefi-cd.bin -efi-boot-part --efi-boot-image \ + boot/limine/limine-uefi-cd.bin -efi-boot-part --efi-boot-image \ --protective-msdos-label build/iso -o build/gila.iso limine bios-install build/gila.iso + tree build/iso/ + clean: rm -rf build cargo clean diff --git a/README.md b/README.md index c444266..358304a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# Gila v0.2.2 - a Rust Microkernel +# Gila v0.2.3 - a Rust Microkernel Gila is a Rust microkernel OS, inspired by the Xinu embedded OS, as well as Linux. I aim to implement multitasking and different users for processes, and eventually a filesystem. I do not aim to make it POSIX-compatible, but it will likely end up sharing many features with POSIX operating systems. diff --git a/build.rs b/build.rs index 16cf1c0..e570aaa 100644 --- a/build.rs +++ b/build.rs @@ -1,7 +1,7 @@ fn main() { let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap(); // Tell cargo to pass the linker script to the linker.. - println!("cargo:rustc-link-arg=-Tsrc/arch/{arch}/linker.ld"); + println!("cargo:rustc-link-arg=-Tsrc/kernel/arch/{arch}/linker.ld"); // ..and to re-run if it changes. - println!("cargo:rerun-if-changed=src/arch/{arch}linker.ld"); + println!("cargo:rerun-if-changed=src/kernel/arch/{arch}linker.ld"); } diff --git a/limine.conf b/limine.conf index ec726eb..d494fa6 100644 --- a/limine.conf +++ b/limine.conf @@ -2,5 +2,5 @@ timeout: 5 /Gila protocol: limine - kernel_path: boot():/gila - cmdline: -loglevel=INFO -logdev=display,serial \ No newline at end of file + kernel_path: boot():/boot/kernel + cmdline: -loglevel=INFO -logdev=display,serial diff --git a/src/arch/aarch64/asm.rs b/src/kernel/arch/aarch64/asm.rs similarity index 100% rename from src/arch/aarch64/asm.rs rename to src/kernel/arch/aarch64/asm.rs diff --git a/src/arch/aarch64/display.rs b/src/kernel/arch/aarch64/display.rs similarity index 100% rename from src/arch/aarch64/display.rs rename to src/kernel/arch/aarch64/display.rs diff --git a/src/arch/aarch64/linker.ld b/src/kernel/arch/aarch64/linker.ld similarity index 100% rename from src/arch/aarch64/linker.ld rename to src/kernel/arch/aarch64/linker.ld diff --git a/src/arch/aarch64/mod.rs b/src/kernel/arch/aarch64/mod.rs similarity index 100% rename from src/arch/aarch64/mod.rs rename to src/kernel/arch/aarch64/mod.rs diff --git a/src/arch/loongarch64/asm.rs b/src/kernel/arch/loongarch64/asm.rs similarity index 100% rename from src/arch/loongarch64/asm.rs rename to src/kernel/arch/loongarch64/asm.rs diff --git a/src/arch/loongarch64/display.rs b/src/kernel/arch/loongarch64/display.rs similarity index 100% rename from src/arch/loongarch64/display.rs rename to src/kernel/arch/loongarch64/display.rs diff --git a/src/arch/loongarch64/linker.ld b/src/kernel/arch/loongarch64/linker.ld similarity index 100% rename from src/arch/loongarch64/linker.ld rename to src/kernel/arch/loongarch64/linker.ld diff --git a/src/arch/loongarch64/mod.rs b/src/kernel/arch/loongarch64/mod.rs similarity index 100% rename from src/arch/loongarch64/mod.rs rename to src/kernel/arch/loongarch64/mod.rs diff --git a/src/arch/mod.rs b/src/kernel/arch/mod.rs similarity index 100% rename from src/arch/mod.rs rename to src/kernel/arch/mod.rs diff --git a/src/arch/riscv64/asm.rs b/src/kernel/arch/riscv64/asm.rs similarity index 100% rename from src/arch/riscv64/asm.rs rename to src/kernel/arch/riscv64/asm.rs diff --git a/src/arch/riscv64/display.rs b/src/kernel/arch/riscv64/display.rs similarity index 100% rename from src/arch/riscv64/display.rs rename to src/kernel/arch/riscv64/display.rs diff --git a/src/arch/riscv64/linker.ld b/src/kernel/arch/riscv64/linker.ld similarity index 100% rename from src/arch/riscv64/linker.ld rename to src/kernel/arch/riscv64/linker.ld diff --git a/src/arch/riscv64/mod.rs b/src/kernel/arch/riscv64/mod.rs similarity index 100% rename from src/arch/riscv64/mod.rs rename to src/kernel/arch/riscv64/mod.rs diff --git a/src/arch/x86_64/acpi.rs b/src/kernel/arch/x86_64/acpi.rs similarity index 100% rename from src/arch/x86_64/acpi.rs rename to src/kernel/arch/x86_64/acpi.rs diff --git a/src/arch/x86_64/asm.rs b/src/kernel/arch/x86_64/asm.rs similarity index 100% rename from src/arch/x86_64/asm.rs rename to src/kernel/arch/x86_64/asm.rs diff --git a/src/arch/x86_64/display.rs b/src/kernel/arch/x86_64/display.rs similarity index 100% rename from src/arch/x86_64/display.rs rename to src/kernel/arch/x86_64/display.rs diff --git a/src/arch/x86_64/linker.ld b/src/kernel/arch/x86_64/linker.ld similarity index 100% rename from src/arch/x86_64/linker.ld rename to src/kernel/arch/x86_64/linker.ld diff --git a/src/arch/x86_64/mod.rs b/src/kernel/arch/x86_64/mod.rs similarity index 100% rename from src/arch/x86_64/mod.rs rename to src/kernel/arch/x86_64/mod.rs diff --git a/src/boot.rs b/src/kernel/boot.rs similarity index 79% rename from src/boot.rs rename to src/kernel/boot.rs index 1caa1bc..d8233eb 100644 --- a/src/boot.rs +++ b/src/kernel/boot.rs @@ -12,10 +12,10 @@ static _END_MARKER: RequestsEndMarker = RequestsEndMarker::new(); pub static BASE_REVISION: BaseRevision = limine::BaseRevision::new(); #[used] #[unsafe(link_section = ".requests")] -pub static SMP_REQUEST: SmpRequest = limine::request::SmpRequest::new(); +pub static MP_REQUEST: MpRequest = limine::request::MpRequest::new(); #[used] #[unsafe(link_section = ".requests")] -pub static FILE_REQUEST: KernelFileRequest = limine::request::KernelFileRequest::new(); +pub static FILE_REQUEST: ExecutableFileRequest = limine::request::ExecutableFileRequest::new(); #[used] #[unsafe(link_section = ".requests")] pub static RSDP_REQUEST: RsdpRequest = limine::request::RsdpRequest::new(); diff --git a/src/log.rs b/src/kernel/log.rs similarity index 100% rename from src/log.rs rename to src/kernel/log.rs diff --git a/src/main.rs b/src/kernel/main.rs similarity index 76% rename from src/main.rs rename to src/kernel/main.rs index 1fc1e82..24b5c08 100644 --- a/src/main.rs +++ b/src/kernel/main.rs @@ -27,8 +27,8 @@ unsafe extern "C" fn main() -> ! { } // Set up some stuff based on kernel params if we get any - if let Some(kernel_file_response) = FILE_REQUEST.get_response() { - let kernel_parameters = get_kernel_params(kernel_file_response.file().cmdline()); + if let Some(executable_file_response) = FILE_REQUEST.get_response() { + let kernel_parameters = get_kernel_params(limine::file::File::string(executable_file_response.file()).to_bytes()); // Set up logging level from params if let Some(level) = kernel_parameters.get("-loglevel") { @@ -51,14 +51,14 @@ unsafe extern "C" fn main() -> ! { LogLevel::Info, &format!( "Boot: Kernel cmdline: {}", - String::from_utf8_lossy(kernel_file_response.file().cmdline()) + String::from_utf8_lossy(limine::file::File::string(executable_file_response.file()).to_bytes()) ), ); log( LogLevel::Info, &format!( "Boot: Kernel file path: {}", - String::from_utf8_lossy(kernel_file_response.file().path()) + String::from_utf8_lossy(executable_file_response.file().path().to_bytes()) ), ); } @@ -68,20 +68,20 @@ unsafe extern "C" fn main() -> ! { ); log(LogLevel::Info, "Boot: Trans Rights!"); - let _smp_response = SMP_REQUEST.get_response(); + let _smp_response = MP_REQUEST.get_response(); match _smp_response { None => log( LogLevel::Error, - "SMP: bootloader response not received. Multiprocessing is disabled.", + "MP: bootloader response not received. Multiprocessing is disabled.", ), Some(resp) => { log( LogLevel::Info, - "SMP: bootloader response received. Multiprocessing enabled.", + "MP: bootloader response received. Multiprocessing enabled.", ); log( LogLevel::Info, - &format!("SMP: {} CPUs found.", resp.cpus().len()), + &format!("MP: {} CPUs found.", resp.cpus().len()), ); } } diff --git a/src/memory.rs b/src/kernel/memory.rs similarity index 100% rename from src/memory.rs rename to src/kernel/memory.rs diff --git a/src/panic.rs b/src/kernel/panic.rs similarity index 100% rename from src/panic.rs rename to src/kernel/panic.rs diff --git a/src/params.rs b/src/kernel/params.rs similarity index 100% rename from src/params.rs rename to src/kernel/params.rs diff --git a/src/process.rs b/src/kernel/process.rs similarity index 57% rename from src/process.rs rename to src/kernel/process.rs index edd7ff6..d45fc0c 100644 --- a/src/process.rs +++ b/src/kernel/process.rs @@ -1,5 +1,7 @@ #![allow(unused_imports)] +use enumflags2::{bitflags, make_bitflags, BitFlags}; + use crate::memory::MemoryRegion; use crate::memory::alloc; @@ -31,6 +33,8 @@ pub struct Process { prio: u16, /// Which semaphor the process is waiting on. semaphor_wait: Option, + /// What capabilities the process has + capabilities: BitFlags, } #[allow(dead_code)] @@ -50,3 +54,26 @@ pub enum ProcessState { Sleeping, Suspended, } + +#[bitflags] +#[repr(u32)] +#[derive(Copy, Clone)] +pub enum ProcessCapabilities { + // Process capabilities + ProcessEnum, // Enumerate running process IDs and names + ProcessRead, // Read information from a process struct + ProcessKill, // Kill any process + ProcessSpawn, // Create a new process + ProcessExec, // Replace self with new process image + // File system capabilities + FileEnum, // Enumerate directories and files + FileRead, // Read files + FileWrite, // Write to files + FilePermission, // Modify file permissions + FileCreate, // Create files + FileDelete, // Delete files + FileSystem, // Mount, unmount, and modify filesystems + // Kernel config capabilities + KernelCfgRead, // Read kernel configurations + KernelCfgWrite, // Modify kernel configurations +} diff --git a/src/resources.rs b/src/kernel/resources.rs similarity index 100% rename from src/resources.rs rename to src/kernel/resources.rs