From f53f5e4b980f5e2717907010e32e65c4d7f57322 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 22 Nov 2020 13:05:16 +0800 Subject: [PATCH] Chapter2: Clear .bss inside application. --- user/src/bin/01store_fault.rs | 2 +- user/src/lib.rs | 10 ++++++++++ user/src/linker.ld | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/user/src/bin/01store_fault.rs b/user/src/bin/01store_fault.rs index 7f02ae8e..790196b2 100644 --- a/user/src/bin/01store_fault.rs +++ b/user/src/bin/01store_fault.rs @@ -7,7 +7,7 @@ extern crate user_lib; #[no_mangle] fn main() -> i32 { - println!("Into Test store_fault, we will insert an invalid store behavior..."); + println!("Into Test store_fault, we will insert an invalid store operation..."); println!("Kernel should kill this application!"); unsafe { (0x0 as *mut u8).write_volatile(0); } 0 diff --git a/user/src/lib.rs b/user/src/lib.rs index c905e412..ed7ba84c 100644 --- a/user/src/lib.rs +++ b/user/src/lib.rs @@ -11,6 +11,7 @@ mod lang_items; #[no_mangle] #[link_section = ".text.entry"] pub extern "C" fn _start() -> ! { + clear_bss(); syscall::sys_exit(main()); panic!("unreachable after sys_exit!"); } @@ -21,3 +22,12 @@ fn main() -> i32 { panic!("Cannot find main!"); } +fn clear_bss() { + extern "C" { + fn start_bss(); + fn end_bss(); + } + (start_bss as usize..end_bss as usize).for_each(|addr| { + unsafe { (addr as *mut u8).write_volatile(0); } + }); +} \ No newline at end of file diff --git a/user/src/linker.ld b/user/src/linker.ld index 40db14a2..cbf7486e 100644 --- a/user/src/linker.ld +++ b/user/src/linker.ld @@ -17,7 +17,9 @@ SECTIONS *(.data .data.*) } .bss : { + start_bss = .; *(.bss .bss.*) + end_bss = .; } /DISCARD/ : { *(.eh_frame)