Reorganize, process capabilities

This commit is contained in:
River 2025-03-13 00:28:50 -04:00
parent a68019ee31
commit 6829ef55fc
Signed by: shibedrill
GPG Key ID: 5FE0CB25945EFAA2
32 changed files with 134 additions and 37 deletions

62
Cargo.lock generated
View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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");
}

View File

@ -2,5 +2,5 @@ timeout: 5
/Gila
protocol: limine
kernel_path: boot():/gila
kernel_path: boot():/boot/kernel
cmdline: -loglevel=INFO -logdev=display,serial

View File

@ -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();

View File

@ -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()),
);
}
}

View File

@ -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<u32>,
/// What capabilities the process has
capabilities: BitFlags<ProcessCapabilities>,
}
#[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
}