mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 18:03:25 +00:00
Use kcmdline to specify init instead of hardcoding
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
807c8355c0
commit
1090f03b34
@ -25,6 +25,7 @@ use crate::{
|
|||||||
process::status::ProcessStatus,
|
process::status::ProcessStatus,
|
||||||
thread::{kernel_thread::KernelThreadExt, Thread},
|
thread::{kernel_thread::KernelThreadExt, Thread},
|
||||||
};
|
};
|
||||||
|
use alloc::sync::Arc;
|
||||||
use jinux_frame::{boot, exit_qemu};
|
use jinux_frame::{boot, exit_qemu};
|
||||||
use process::Process;
|
use process::Process;
|
||||||
|
|
||||||
@ -75,11 +76,18 @@ fn init_thread() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
print_banner();
|
print_banner();
|
||||||
let busybox = run_busybox().expect("run busybox fails");
|
|
||||||
|
let karg = boot::kernel_cmdline();
|
||||||
|
|
||||||
|
let initproc = Process::spawn_user_process(
|
||||||
|
karg.get_initproc_path().unwrap(),
|
||||||
|
karg.get_initproc_argv().unwrap().to_vec(),
|
||||||
|
karg.get_initproc_envp().unwrap().to_vec(),
|
||||||
|
).expect("Run init process failed.");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
// If busybox becomes zombie, then exit qemu.
|
// If initproc becomes zombie, then exit qemu.
|
||||||
if *busybox.status().lock() == ProcessStatus::Zombie {
|
if *initproc.status().lock() == ProcessStatus::Zombie {
|
||||||
println!("Exit jinux.");
|
println!("Exit jinux.");
|
||||||
exit_qemu(jinux_frame::QemuExitCode::Success);
|
exit_qemu(jinux_frame::QemuExitCode::Success);
|
||||||
}
|
}
|
||||||
@ -96,29 +104,6 @@ pub fn run_first_process() -> ! {
|
|||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_busybox() -> Result<Arc<Process>> {
|
|
||||||
let executable_path = "/usr/bin/busybox";
|
|
||||||
let argv = ["sh", "-l"];
|
|
||||||
let envp = [
|
|
||||||
"SHELL=/bin/sh",
|
|
||||||
"LOGNAME=root",
|
|
||||||
"HOME=/",
|
|
||||||
"USER=root",
|
|
||||||
"PATH=/bin",
|
|
||||||
];
|
|
||||||
let argv = argv
|
|
||||||
.into_iter()
|
|
||||||
.map(|arg| CString::new(arg).unwrap())
|
|
||||||
.collect();
|
|
||||||
let envp = envp
|
|
||||||
.into_iter()
|
|
||||||
.map(|env| CString::new(env).unwrap())
|
|
||||||
.collect();
|
|
||||||
println!("");
|
|
||||||
println!("BusyBox v1.35.0 built-in shell (ash)\n");
|
|
||||||
Process::spawn_user_process(executable_path, argv, envp)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn print_banner() {
|
fn print_banner() {
|
||||||
println!("\x1B[36m");
|
println!("\x1B[36m");
|
||||||
println!(
|
println!(
|
||||||
|
Reference in New Issue
Block a user