From 902b0421c3f187f5efcd5540bac1ecb15b122b06 Mon Sep 17 00:00:00 2001 From: LI Qing Date: Wed, 24 May 2023 18:03:41 +0800 Subject: [PATCH] Use bootloader to load initramfs --- kernel/main.rs | 15 +++++++++++++-- services/libs/jinux-std/src/lib.rs | 8 ++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/kernel/main.rs b/kernel/main.rs index a37fcc0ff..1ad71771f 100644 --- a/kernel/main.rs +++ b/kernel/main.rs @@ -10,9 +10,10 @@ extern crate jinux_frame; use core::panic::PanicInfo; use jinux_frame::println; -use limine::LimineBootInfoRequest; +use limine::{LimineBootInfoRequest, LimineModuleRequest}; static BOOTLOADER_INFO: LimineBootInfoRequest = LimineBootInfoRequest::new(0); +static BOOTLOADER_MODULE: LimineModuleRequest = LimineModuleRequest::new(0); #[no_mangle] pub extern "C" fn _start() -> ! { @@ -21,9 +22,19 @@ pub extern "C" fn _start() -> ! { jinux_frame::init(); println!("[kernel] finish init jinux_frame"); component::init_all(component::parse_metadata!()).unwrap(); - jinux_std::init(); + jinux_std::init(read_ramdisk_content()); jinux_std::run_first_process(); } + +fn read_ramdisk_content() -> &'static [u8] { + let module_info = BOOTLOADER_MODULE.get_response().get().unwrap(); + assert!(module_info.module_count == 1); + let ramdisk_file = &module_info.modules()[0]; + let base_ptr = ramdisk_file.base.as_ptr().unwrap(); + let length = ramdisk_file.length as usize; + unsafe { core::slice::from_raw_parts(base_ptr, length) } +} + #[cfg(not(test))] #[panic_handler] fn panic(info: &PanicInfo) -> ! { diff --git a/services/libs/jinux-std/src/lib.rs b/services/libs/jinux-std/src/lib.rs index 905cdd18e..e65c42701 100644 --- a/services/libs/jinux-std/src/lib.rs +++ b/services/libs/jinux-std/src/lib.rs @@ -44,10 +44,10 @@ pub mod tty; mod util; pub mod vm; -pub fn init() { +pub fn init(ramdisk: &[u8]) { driver::init(); process::fifo_scheduler::init(); - fs::initramfs::init(read_ramdisk_content()).unwrap(); + fs::initramfs::init(ramdisk).unwrap(); } fn init_thread() { @@ -78,10 +78,6 @@ fn init_thread() { } } -fn read_ramdisk_content() -> &'static [u8] { - include_bytes!("../../../../regression/ramdisk/build/ramdisk.cpio") -} - /// first process never return #[controlled] pub fn run_first_process() -> ! {