diff --git a/os/build.rs b/os/build.rs index 5d0c988..3cd2e06 100644 --- a/os/build.rs +++ b/os/build.rs @@ -53,4 +53,4 @@ app_{0}_end:"#, )?; } Ok(()) -} \ No newline at end of file +} diff --git a/os/src/batch.rs b/os/src/batch.rs index 2698466..2b09e78 100644 --- a/os/src/batch.rs +++ b/os/src/batch.rs @@ -3,6 +3,7 @@ use core::arch::asm; use lazy_static::lazy_static; use crate::log_information; +use crate::sbi::shutdown; use crate::sync::single_cell::SingleCell; use crate::trap::context::TrapContext; @@ -26,14 +27,13 @@ lazy_static! { let num_app_ptr = _num_app as usize as *const usize; let num_app = num_app_ptr.read_volatile(); let mut start_addresses: [usize; MAX_APP_NUMBER + 1] = [0; MAX_APP_NUMBER + 1]; - let start_addresses_raw: &[usize] = core::slice::from_raw_parts( - num_app_ptr.add(1), num_app + 1 - ); + let start_addresses_raw: &[usize] = + core::slice::from_raw_parts(num_app_ptr.add(1), num_app + 1); start_addresses[..=num_app].copy_from_slice(start_addresses_raw); AppManager { app_count: num_app, current: 0, - start_addresses + start_addresses, } }) }; @@ -44,10 +44,12 @@ impl AppManager { log_information!("[kernel] Application count is {}.", self.app_count); for i in 0..self.app_count { - log_information!("[kernel] Application_{} ({:#x} -> {:#x})", - i, - self.start_addresses[i], - self.start_addresses[i + 1]); + log_information!( + "[kernel] Application_{} ({:#x} -> {:#x})", + i, + self.start_addresses[i], + self.start_addresses[i + 1] + ); } } @@ -66,19 +68,14 @@ impl AppManager { log_information!("[kernel] Loading application_{}...", app_id); - core::slice::from_raw_parts_mut( - APP_BASE_ADDRESS as *mut u8, - APP_SIZE_LIMIT - ).fill(0); + core::slice::from_raw_parts_mut(APP_BASE_ADDRESS as *mut u8, APP_SIZE_LIMIT).fill(0); let app_source = core::slice::from_raw_parts( self.start_addresses[app_id] as *const u8, - self.start_addresses[app_id + 1] - self.start_addresses[app_id] - ); - let app_destination = core::slice::from_raw_parts_mut( - APP_BASE_ADDRESS as *mut u8, - app_source.len() + self.start_addresses[app_id + 1] - self.start_addresses[app_id], ); + let app_destination = + core::slice::from_raw_parts_mut(APP_BASE_ADDRESS as *mut u8, app_source.len()); app_destination.copy_from_slice(app_source); // 保证指令缓存的更新 @@ -92,7 +89,7 @@ const KERNEL_STACK_SIZE: usize = 4096 * 2; #[repr(align(4096))] struct UserStack { - data: [u8; USER_STACK_SIZE] + data: [u8; USER_STACK_SIZE], } impl UserStack { @@ -103,7 +100,7 @@ impl UserStack { #[repr(align(4096))] struct KernelStack { - data: [u8; KERNEL_STACK_SIZE] + data: [u8; KERNEL_STACK_SIZE], } impl KernelStack { @@ -120,8 +117,12 @@ impl KernelStack { } } -static KERNEL_STACK: KernelStack = KernelStack { data: [0; KERNEL_STACK_SIZE]}; -static USER_STACK: UserStack = UserStack { data: [0; USER_STACK_SIZE]}; +static KERNEL_STACK: KernelStack = KernelStack { + data: [0; KERNEL_STACK_SIZE], +}; +static USER_STACK: UserStack = UserStack { + data: [0; USER_STACK_SIZE], +}; pub fn print_app_information() { let app_manager = APP_MANAGER.exclusive_borrow(); @@ -131,6 +132,11 @@ pub fn print_app_information() { pub fn run_next_application() -> ! { let mut app_manager = APP_MANAGER.exclusive_borrow(); let current_app = app_manager.get_current_app(); + if current_app >= app_manager.app_count { + log_information!("Run out of applications, the os will stop!"); + shutdown(true); + } + unsafe { app_manager.load_app(current_app); } @@ -147,12 +153,10 @@ pub fn run_next_application() -> ! { unsafe { let context_address = KERNEL_STACK.push_context(TrapContext::init_application_context( APP_BASE_ADDRESS, - USER_STACK.get_sp() + USER_STACK.get_sp(), )) as *const _ as usize; __restore(context_address); unreachable!() } } - - diff --git a/os/src/console.rs b/os/src/console.rs index 7d2b0cf..e88704f 100644 --- a/os/src/console.rs +++ b/os/src/console.rs @@ -1,6 +1,6 @@ +use crate::sbi::console_print; use core::fmt; use core::fmt::Write; -use crate::sbi::console_print; struct Stdout; @@ -65,4 +65,4 @@ macro_rules! log_trace { ($fmt: literal $(, $($arg: tt)+)?) => { $crate::console::print(format_args!(concat!("\x1b[90m" ,concat!($fmt, "\x1b[0m\n")) $(, $($arg)+)?)); } -} \ No newline at end of file +} diff --git a/os/src/main.rs b/os/src/main.rs index af83c41..c2e2c42 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -1,21 +1,20 @@ #![no_std] #![no_main] -use core::arch::global_asm; use crate::utils::clear_bss; +use core::arch::global_asm; -mod utils; -mod sbi; -mod console; mod batch; +mod console; +mod sbi; mod sync; -mod trap; mod syscall; +mod trap; +mod utils; global_asm!(include_str!("entry.asm")); global_asm!(include_str!("link_app.asm")); - #[no_mangle] fn rust_main() -> ! { clear_bss(); @@ -24,4 +23,3 @@ fn rust_main() -> ! { batch::print_app_information(); batch::run_next_application(); } - diff --git a/os/src/sbi.rs b/os/src/sbi.rs index 322fb0b..73c351c 100644 --- a/os/src/sbi.rs +++ b/os/src/sbi.rs @@ -4,7 +4,7 @@ pub fn console_print(c: usize) { } pub fn shutdown(failure: bool) -> ! { - use sbi_rt::{system_reset, Shutdown, NoReason, SystemFailure}; + use sbi_rt::{system_reset, NoReason, Shutdown, SystemFailure}; if failure { system_reset(Shutdown, SystemFailure); @@ -13,4 +13,4 @@ pub fn shutdown(failure: bool) -> ! { } unreachable!() -} \ No newline at end of file +} diff --git a/os/src/sync.rs b/os/src/sync.rs index 5c76622..01d434f 100644 --- a/os/src/sync.rs +++ b/os/src/sync.rs @@ -1 +1 @@ -pub mod single_cell; \ No newline at end of file +pub mod single_cell; diff --git a/os/src/sync/single_cell.rs b/os/src/sync/single_cell.rs index c647797..f6687cd 100644 --- a/os/src/sync/single_cell.rs +++ b/os/src/sync/single_cell.rs @@ -2,17 +2,15 @@ use core::cell::{RefCell, RefMut}; /// 只能在单核场景下保持安全的屑RefCell pub struct SingleCell { - inner: RefCell + inner: RefCell, } -unsafe impl Sync for SingleCell { - -} +unsafe impl Sync for SingleCell {} impl SingleCell { pub unsafe fn new(value: T) -> SingleCell { SingleCell { - inner: RefCell::new(value) + inner: RefCell::new(value), } } diff --git a/os/src/syscall/process.rs b/os/src/syscall/process.rs index b6ec127..619c197 100644 --- a/os/src/syscall/process.rs +++ b/os/src/syscall/process.rs @@ -4,4 +4,4 @@ use crate::println; pub fn sys_exit(exit_state: i32) -> ! { println!("[kernel] Application exited with code {}.", exit_state); run_next_application() -} \ No newline at end of file +} diff --git a/os/src/trap.asm b/os/src/trap.asm index 3b3811d..7ca7154 100644 --- a/os/src/trap.asm +++ b/os/src/trap.asm @@ -38,8 +38,6 @@ __alltraps: mv a0, sp call trap_handler - - __restore: # case1: start running app by __restore # case2: back to U after handling trap diff --git a/os/src/trap.rs b/os/src/trap.rs index d989dd4..e7aec3e 100644 --- a/os/src/trap.rs +++ b/os/src/trap.rs @@ -1,20 +1,22 @@ -use core::arch::global_asm; -use riscv::register::{ - mtvec::TrapMode, - scause::{self, Exception, Trap}, - stval, stvec -}; use crate::batch::run_next_application; use crate::println; use crate::syscall::syscall; use crate::trap::context::TrapContext; +use core::arch::global_asm; +use riscv::register::{ + mtvec::TrapMode, + scause::{self, Exception, Trap}, + stval, stvec, +}; pub mod context; global_asm!(include_str!("trap.asm")); pub fn init() { - extern "C" { fn __alltraps(); } + extern "C" { + fn __alltraps(); + } unsafe { stvec::write(__alltraps as usize, TrapMode::Direct); } @@ -29,19 +31,23 @@ pub fn trap_handler(context: &mut TrapContext) -> &mut TrapContext { Trap::Exception(Exception::UserEnvCall) => { context.sepc += 4; context.x[10] = syscall(context.x[17], [context.x[10], context.x[11], context.x[12]]); - }, + } Trap::Exception(Exception::StoreFault) | Trap::Exception(Exception::StorePageFault) => { println!("[kernel] PageFault in application, kernel will kill it."); run_next_application(); - }, + } Trap::Exception(Exception::IllegalInstruction) => { println!("[kernel] Illegal instruction in application, kernel will kill it."); run_next_application(); - }, + } _ => { - panic!("[Kernel] Unsupported trap: {:?}, stval = {:#x}!", scause.cause(), stval); + panic!( + "[Kernel] Unsupported trap: {:?}, stval = {:#x}!", + scause.cause(), + stval + ); } } context -} \ No newline at end of file +} diff --git a/os/src/trap/context.rs b/os/src/trap/context.rs index 8ef2412..c467b0a 100644 --- a/os/src/trap/context.rs +++ b/os/src/trap/context.rs @@ -4,7 +4,7 @@ use riscv::register::sstatus::{self, Sstatus, SPP}; pub struct TrapContext { pub x: [usize; 32], pub s_status: Sstatus, - pub sepc: usize + pub sepc: usize, } impl TrapContext { @@ -14,7 +14,7 @@ impl TrapContext { let mut context = Self { x: [0; 32], s_status: sstatus, - sepc: entry + sepc: entry, }; context.set_sp(sp); @@ -26,4 +26,3 @@ impl TrapContext { self.x[2] = sp; } } - diff --git a/os/src/utils.rs b/os/src/utils.rs index 9d5fdad..72f9175 100644 --- a/os/src/utils.rs +++ b/os/src/utils.rs @@ -1,17 +1,19 @@ use core::panic::PanicInfo; -use crate::println; + +use crate::log_error; use crate::sbi::shutdown; #[panic_handler] fn panic(info: &PanicInfo) -> ! { if let Some(location) = info.location() { - println!("Panicked at {}:{} {}.", + log_error!( + "Panicked at {}:{} {}.", location.file(), location.line(), info.message() ); } else { - println!("Panicked: {}.", info.message()); + log_error!("Panicked: {}.", info.message()); } shutdown(true) @@ -24,8 +26,6 @@ pub fn clear_bss() { } for m in sbss as usize..ebss as usize { - unsafe { - (m as *mut u8).write_volatile(0) - } + unsafe { (m as *mut u8).write_volatile(0) } } -} \ No newline at end of file +} diff --git a/user/src/bin/hello_world.rs b/user/src/bin/hello_world.rs index 5329f79..f457094 100644 --- a/user/src/bin/hello_world.rs +++ b/user/src/bin/hello_world.rs @@ -9,4 +9,4 @@ fn main() -> i32 { println!("Hello, world!"); 0 -} \ No newline at end of file +} diff --git a/user/src/bin/illegal_instruction.rs b/user/src/bin/illegal_instruction.rs index cbd3210..04dac37 100644 --- a/user/src/bin/illegal_instruction.rs +++ b/user/src/bin/illegal_instruction.rs @@ -14,4 +14,4 @@ fn main() -> i32 { asm!("sret"); } 0 -} \ No newline at end of file +} diff --git a/user/src/bin/power.rs b/user/src/bin/power.rs index 54fde24..f628f34 100644 --- a/user/src/bin/power.rs +++ b/user/src/bin/power.rs @@ -24,4 +24,4 @@ fn main() -> i32 { } println!("Test power OK!"); 0 -} \ No newline at end of file +} diff --git a/user/src/bin/store_fault.rs b/user/src/bin/store_fault.rs index aedf88b..f8023eb 100644 --- a/user/src/bin/store_fault.rs +++ b/user/src/bin/store_fault.rs @@ -12,4 +12,4 @@ fn main() -> i32 { core::ptr::null_mut::().write_volatile(0); } 0 -} \ No newline at end of file +} diff --git a/user/src/console.rs b/user/src/console.rs index 0d41582..253fb41 100644 --- a/user/src/console.rs +++ b/user/src/console.rs @@ -1,5 +1,5 @@ -use core::fmt::Write; use crate::syscall::sys_write; +use core::fmt::Write; struct Stdout; @@ -29,4 +29,4 @@ macro_rules! println { ($fmt: literal $(, $($arg: tt)+)?) => { $crate::console::print(format_args!(concat!($fmt, "\n") $(, $($arg)+)?)); } -} \ No newline at end of file +} diff --git a/user/src/lib.rs b/user/src/lib.rs index 9c42c3f..fbe8862 100644 --- a/user/src/lib.rs +++ b/user/src/lib.rs @@ -3,8 +3,8 @@ use crate::syscall::{sys_exit, sys_write}; -mod utils; mod syscall; +mod utils; #[macro_use] pub mod console; @@ -28,4 +28,3 @@ pub fn write(fd: usize, buf: &[u8]) -> isize { pub fn exit(exit_code: i32) -> isize { sys_exit(exit_code) } - diff --git a/user/src/syscall.rs b/user/src/syscall.rs index b4a305d..6025b8e 100644 --- a/user/src/syscall.rs +++ b/user/src/syscall.rs @@ -4,7 +4,7 @@ const SYSCALL_WRITE: usize = 64; const SYSCALL_EXIT: usize = 93; fn syscall(id: usize, args: [usize; 3]) -> isize { - let mut result : isize; + let mut result: isize; unsafe { asm!( @@ -25,4 +25,4 @@ pub fn sys_write(fd: usize, buffer: &[u8]) -> isize { pub fn sys_exit(exit_code: i32) -> isize { syscall(SYSCALL_EXIT, [exit_code as usize, 0, 0]) -} \ No newline at end of file +} diff --git a/user/src/utils.rs b/user/src/utils.rs index 85b7f0f..2644afe 100644 --- a/user/src/utils.rs +++ b/user/src/utils.rs @@ -1,5 +1,5 @@ -use core::panic::PanicInfo; use crate::println; +use core::panic::PanicInfo; pub fn clear_bss() { extern "C" { @@ -9,9 +9,7 @@ pub fn clear_bss() { } for i in start_bss as usize..end_bss as usize { - unsafe { - (i as *mut u8).write_volatile(0) - } + unsafe { (i as *mut u8).write_volatile(0) } } } @@ -20,10 +18,15 @@ fn panic_handler(info: &PanicInfo) -> ! { let message = info.message(); if let Some(location) = info.location() { - println!("Panicked at {}:{} {}", location.file(), location.line(), message); + println!( + "Panicked at {}:{} {}", + location.file(), + location.line(), + message + ); } else { println!("Panicked: {}", message); } unreachable!() -} \ No newline at end of file +}