diff --git a/bootloader/rustsbi-k210.bin b/bootloader/rustsbi-k210.bin index 5a9fa7d1..7e07391d 100755 Binary files a/bootloader/rustsbi-k210.bin and b/bootloader/rustsbi-k210.bin differ diff --git a/os/build.rs b/os/build.rs index 389587aa..2c006876 100644 --- a/os/build.rs +++ b/os/build.rs @@ -47,6 +47,7 @@ _app_names:"#)?; .section .data .global app_{0}_start .global app_{0}_end + .align 12 app_{0}_start: .incbin "{2}{1}" app_{0}_end:"#, idx, app, TARGET_PATH)?; diff --git a/os/src/main.rs b/os/src/main.rs index 3b3eef9f..aa21a5e2 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -43,6 +43,7 @@ pub fn rust_main() -> ! { mm::init(); mm::remap_test(); task::add_initproc(); + println!("after initproc!"); trap::init(); trap::enable_timer_interrupt(); timer::set_next_trigger(); diff --git a/user/src/bin/00power_3.rs b/user/src/bin/00power_3.rs deleted file mode 100644 index 532829da..00000000 --- a/user/src/bin/00power_3.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -const LEN: usize = 100; - -static mut S: [u64; LEN] = [0u64; LEN]; - -#[no_mangle] -unsafe fn main() -> i32 { - let p = 3u64; - let m = 998244353u64; - let iter: usize = 300000; - let mut cur = 0usize; - S[cur] = 1; - for i in 1..=iter { - let next = if cur + 1 == LEN { 0 } else { cur + 1 }; - S[next] = S[cur] * p % m; - cur = next; - if i % 10000 == 0 { - println!("power_3 [{}/{}]", i, iter); - } - } - println!("{}^{} = {}(mod {})", p, iter, S[cur], m); - println!("Test power_3 OK!"); - 0 -} \ No newline at end of file diff --git a/user/src/bin/01power_5.rs b/user/src/bin/01power_5.rs deleted file mode 100644 index f23e3b84..00000000 --- a/user/src/bin/01power_5.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -const LEN: usize = 100; - -static mut S: [u64; LEN] = [0u64; LEN]; - -#[no_mangle] -unsafe fn main() -> i32 { - let p = 5u64; - let m = 998244353u64; - let iter: usize = 210000; - let mut cur = 0usize; - S[cur] = 1; - for i in 1..=iter { - let next = if cur + 1 == LEN { 0 } else { cur + 1 }; - S[next] = S[cur] * p % m; - cur = next; - if i % 10000 == 0 { - println!("power_5 [{}/{}]", i, iter); - } - } - println!("{}^{} = {}(mod {})", p, iter, S[cur], m); - println!("Test power_5 OK!"); - 0 -} diff --git a/user/src/bin/02power_7.rs b/user/src/bin/02power_7.rs deleted file mode 100644 index 35bada18..00000000 --- a/user/src/bin/02power_7.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -const LEN: usize = 100; - -static mut S: [u64; LEN] = [0u64; LEN]; - -#[no_mangle] -unsafe fn main() -> i32 { - let p = 7u64; - let m = 998244353u64; - let iter: usize = 240000; - let mut cur = 0usize; - S[cur] = 1; - for i in 1..=iter { - let next = if cur + 1 == LEN { 0 } else { cur + 1 }; - S[next] = S[cur] * p % m; - cur = next; - if i % 10000 == 0 { - println!("power_7 [{}/{}]", i, iter); - } - } - println!("{}^{} = {}(mod {})", p, iter, S[cur], m); - println!("Test power_7 OK!"); - 0 -} diff --git a/user/src/bin/03sleep.rs b/user/src/bin/03sleep.rs deleted file mode 100644 index d500f5af..00000000 --- a/user/src/bin/03sleep.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -use user_lib::{get_time, yield_}; - -#[no_mangle] -fn main() -> i32 { - let current_timer = get_time(); - let wait_for = current_timer + 10000000; - while get_time() < wait_for { - yield_(); - } - println!("Test sleep OK!"); - 0 -} \ No newline at end of file diff --git a/user/src/bin/matrix.rs b/user/src/bin/matrix.rs new file mode 100644 index 00000000..729625e0 --- /dev/null +++ b/user/src/bin/matrix.rs @@ -0,0 +1,68 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; + +use user_lib::{fork, wait, yield_, exit, getpid, get_time, wait_once}; + +static NUM: usize = 13; +const N: usize = 10; +static P: i32 = 10007; +type Arr = [[i32; N]; N]; + +fn work(times: isize) { + let mut a: Arr = Default::default(); + let mut b: Arr = Default::default(); + let mut c: Arr = Default::default(); + for i in 0..N { + for j in 0..N { + a[i][j] = 1; + b[i][j] = 1; + } + } + yield_(); + println!("pid {} is running ({} times)!.", getpid(), times); + for _ in 0..times { + for i in 0..N { + for j in 0..N { + c[i][j] = 0; + for k in 0..N { + c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % P; + } + } + } + for i in 0..N { + for j in 0..N { + a[i][j] = c[i][j]; + b[i][j] = c[i][j]; + } + } + } + println!("pid {} done!.", getpid()); + exit(0); +} + +#[no_mangle] +pub fn main() -> i32 { + for _ in 0..NUM { + let pid = fork(); + if pid == 0 { + let current_time = get_time(); + let times = (current_time as i32 as isize) * (current_time as i32 as isize) % 1000; + work(times * 40); + } + } + + println!("fork ok."); + + let mut xstate: i32 = 0; + for _ in 0..NUM { + if wait(&mut xstate) < 0 { + panic!("wait failed."); + } + } + assert!(wait_once(&mut xstate) < 0); + println!("matrix passed."); + 0 +} \ No newline at end of file diff --git a/user/src/lib.rs b/user/src/lib.rs index 995bb36c..8f3c77da 100644 --- a/user/src/lib.rs +++ b/user/src/lib.rs @@ -48,7 +48,22 @@ pub fn get_time() -> isize { sys_get_time() } pub fn getpid() -> isize { sys_getpid() } pub fn fork() -> isize { sys_fork() } pub fn exec(path: &str) -> isize { sys_exec(path) } -pub fn wait(xstate: &mut i32) -> isize { sys_waitpid(-1, xstate as *mut _) } -pub fn waitpid(pid: usize, xstate: &mut i32) -> isize { - sys_waitpid(pid as isize, xstate as *mut _) +pub fn wait(exit_code: &mut i32) -> isize { + loop { + match sys_waitpid(-1, exit_code as *mut _) { + -1 => { yield_(); } + exit_pid => return exit_pid, + } + } +} +pub fn wait_once(exit_code: &mut i32) -> isize { + sys_waitpid(-1, exit_code as *mut _) +} +pub fn waitpid(pid: usize, exit_code: &mut i32) -> isize { + loop { + match sys_waitpid(pid as isize, exit_code as *mut _) { + -1 => { yield_(); } + exit_pid => return exit_pid, + } + } } \ No newline at end of file