From 3625b7578d0c61b69577fda05840c5bb53cb3ad1 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Fri, 4 Dec 2020 17:53:14 +0800 Subject: [PATCH] Analyse ELF. --- os/Cargo.toml | 1 + os/build.rs | 4 ++-- os/src/loader.rs | 39 +++++++++++++++++++++++++++++++++++++++ os/src/main.rs | 2 +- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/os/Cargo.toml b/os/Cargo.toml index 2ccd1f86..588df758 100644 --- a/os/Cargo.toml +++ b/os/Cargo.toml @@ -12,6 +12,7 @@ lazy_static = { version = "1.4.0", features = ["spin_no_std"] } buddy_system_allocator = "0.6" spin = "0.7.0" bitflags = "1.2.1" +xmas-elf = "0.7.0" [features] board_qemu = [] diff --git a/os/build.rs b/os/build.rs index e5a0a46e..d1518ab0 100644 --- a/os/build.rs +++ b/os/build.rs @@ -29,9 +29,9 @@ _num_app: .quad {}"#, apps.len())?; for i in 0..apps.len() { - writeln!(f, r#".quad app_{}_start"#, i)?; + writeln!(f, r#" .quad app_{}_start"#, i)?; } - writeln!(f, r#".quad app_{}_end"#, apps.len() - 1)?; + writeln!(f, r#" .quad app_{}_end"#, apps.len() - 1)?; for (idx, app) in apps.iter().enumerate() { println!("app_{}: {}", idx, app); diff --git a/os/src/loader.rs b/os/src/loader.rs index 893a0677..feea6082 100644 --- a/os/src/loader.rs +++ b/os/src/loader.rs @@ -1,6 +1,7 @@ use crate::trap::TrapContext; use crate::task::TaskContext; use crate::config::*; +use xmas_elf::ElfFile; #[repr(align(4096))] struct KernelStack { @@ -52,6 +53,32 @@ pub fn get_num_app() -> usize { unsafe { (_num_app as usize as *const usize).read_volatile() } } +fn debug_elf(start_addr: usize, end_addr: usize) { + let data_array = unsafe { + core::slice::from_raw_parts(start_addr as *const u8, end_addr - start_addr) + }; + let elf = ElfFile::new(data_array).unwrap(); + let elf_header = elf.header; + let magic = elf_header.pt1.magic; + assert_eq!(magic, [0x7f, 0x45, 0x4c, 0x46], "invalid elf!"); + let ph_count = elf_header.pt2.ph_count(); + println!("ph_count = {}", ph_count); + for i in 0..ph_count { + let ph = elf.program_header(i).unwrap(); + if ph.get_type().unwrap() == xmas_elf::program::Type::Load { + println!( + "offset={:#x},va={:#x},pa={:#x},filesz={:#x},memsz={:#x},align={:#x}", + ph.offset(), + ph.virtual_addr(), + ph.physical_addr(), + ph.file_size(), + ph.mem_size(), + ph.align(), + ); + } + } +} + pub fn load_apps() { extern "C" { fn _num_app(); } let num_app_ptr = _num_app as usize as *const usize; @@ -59,6 +86,18 @@ pub fn load_apps() { let app_start = unsafe { core::slice::from_raw_parts(num_app_ptr.add(1), num_app + 1) }; + println!("num_app = {}", num_app); + for i in 0..num_app { + println!( + "app_{} [{:#x},{:#x}) size={:#x}", + i, + app_start[i], + app_start[i + 1], + app_start[i + 1] - app_start[i] + ); + debug_elf(app_start[i], app_start[i + 1]); + } + loop {} // clear i-cache first unsafe { llvm_asm!("fence.i" :::: "volatile"); } // load apps diff --git a/os/src/main.rs b/os/src/main.rs index 45ea849e..d45f577f 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -43,9 +43,9 @@ pub fn rust_main() -> ! { mm::init(); println!("[kernel] back to world!"); mm::remap_test(); - loop {} trap::init(); loader::load_apps(); + loop {} trap::enable_interrupt(); trap::enable_timer_interrupt(); timer::set_next_trigger();