diff --git a/src/kxos-std/src/lib.rs b/src/kxos-std/src/lib.rs index 187cfd8d..5c13357d 100644 --- a/src/kxos-std/src/lib.rs +++ b/src/kxos-std/src/lib.rs @@ -6,7 +6,7 @@ #![feature(const_btree_new)] #![feature(cstr_from_bytes_until_nul)] -use kxos_frame::println; +use kxos_frame::{println, info, task::Task}; use process::Process; extern crate alloc; @@ -20,15 +20,26 @@ pub fn init() { process::fifo_scheduler::init(); } -pub fn run_first_kernel_task() { - Process::spawn_kernel_task(|| { - println!("hello world from kernel"); +pub fn init_task() { + println!("[kernel] Hello world from init task!"); + + let process = Process::spawn_kernel_task(|| { + println!("[kernel] Hello world from kernel!"); }); + info!("spawn kernel process, pid = {}", process.pid()); + + let elf_file_content = read_elf_content(); + let process = Process::spawn_from_elf(elf_file_content); + info!("spwan user process, pid = {}", process.pid()); + + loop {} } -pub fn run_first_process() { +/// first process never return +pub fn run_first_process() -> ! { let elf_file_content = read_elf_content(); - Process::spawn_from_elf(elf_file_content); + Task::spawn(init_task, None::, None).expect("Spawn first task failed"); + unreachable!() } fn read_elf_content() -> &'static [u8] { diff --git a/src/kxos-std/src/memory/user_stack.rs b/src/kxos-std/src/memory/user_stack.rs index 321be355..e7c57b92 100644 --- a/src/kxos-std/src/memory/user_stack.rs +++ b/src/kxos-std/src/memory/user_stack.rs @@ -1,4 +1,3 @@ -use alloc::sync::Arc; use kxos_frame::vm::{Vaddr, VmPerm, VmSpace}; use super::vm_page::VmPageRange; @@ -8,9 +7,8 @@ pub const USER_STACK_SIZE: usize = 0x1000 * 16; // 64KB pub struct UserStack { /// The low address of user stack - pub stack_base: Vaddr, + stack_base: Vaddr, stack_size: usize, - vm_space: Option>, } impl UserStack { @@ -19,7 +17,6 @@ impl UserStack { Self { stack_base, stack_size, - vm_space: None, } } @@ -28,7 +25,6 @@ impl UserStack { Self { stack_base: USER_STACK_BASE, stack_size: USER_STACK_SIZE, - vm_space: None, } } diff --git a/src/kxos-std/src/process/mod.rs b/src/kxos-std/src/process/mod.rs index b9445d2c..f5fc912a 100644 --- a/src/kxos-std/src/process/mod.rs +++ b/src/kxos-std/src/process/mod.rs @@ -2,7 +2,7 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use alloc::sync::Arc; // use kxos_frame::{sync::SpinLock, task::Task, user::UserSpace}; -use kxos_frame::{debug, task::Task}; +use kxos_frame::task::Task; use self::task::spawn_user_task_from_elf; @@ -39,8 +39,7 @@ impl Process { F: Fn() + Send + Sync + 'static, { let pid = new_pid(); - debug!("pid = {}", pid); - let task = Task::spawn(task_fn, None::, None).expect("spawn kernel task failed"); + let task = Task::spawn(task_fn, pid, None).expect("spawn kernel task failed"); let exit_code = 0; Self { pid, @@ -48,6 +47,10 @@ impl Process { exit_code, } } + + pub fn pid(&self) -> usize { + self.pid + } } /// create a new pid for new process diff --git a/src/kxos-std/src/process/task.rs b/src/kxos-std/src/process/task.rs index 16807f22..86b84eb0 100644 --- a/src/kxos-std/src/process/task.rs +++ b/src/kxos-std/src/process/task.rs @@ -25,6 +25,7 @@ pub fn spawn_user_task_from_elf(elf_file_content: &[u8]) -> Arc { let cur = Task::current(); let user_space = cur.user_space().expect("user task should have user space"); let mut user_mode = UserMode::new(user_space); + debug!("in user task"); loop { let user_event = user_mode.execute(); debug!("return from user mode"); diff --git a/src/kxos-user/hello_world/hello_world.s b/src/kxos-user/hello_world/hello_world.s index 0baea631..58e8783c 100644 --- a/src/kxos-user/hello_world/hello_world.s +++ b/src/kxos-user/hello_world/hello_world.s @@ -2,20 +2,18 @@ .section .text _start: - call print_message - call print_message - call print_message + call print_message + call print_message + call print_message mov $60, %rax # syscall number of exit - mov $0, %rdi # exit code + mov $0, %rdi # exit code syscall print_message: mov $1, %rax # syscall number of write mov $1, %rdi # stdout - mov $message, %rsi # address of message - mov $message, %r11 - mov $message_end, %r12 - sub %r11, %r12 # calculate message len - mov %r12, %rdx # number of bytes + mov $message, %rsi # address of message + mov $message_end, %rdx + sub %rsi, %rdx # calculate message len syscall ret .section .rodata diff --git a/src/src/main.rs b/src/src/main.rs index 6ec11ab8..4c4cfc9d 100644 --- a/src/src/main.rs +++ b/src/src/main.rs @@ -20,8 +20,6 @@ fn kernel_main(boot_info: &'static mut BootInfo) -> ! { kxos_std::init(); kxos_std::run_first_process(); - - loop {} } #[cfg(not(test))] #[panic_handler]