diff --git a/src/services/libs/jinux-std/src/lib.rs b/src/services/libs/jinux-std/src/lib.rs index 89004ce1..8338214e 100644 --- a/src/services/libs/jinux-std/src/lib.rs +++ b/src/services/libs/jinux-std/src/lib.rs @@ -68,6 +68,7 @@ fn init_thread() { thread.tid() ); + print_banner(); run_busybox().expect("run busybox fails"); loop { @@ -110,3 +111,18 @@ fn run_busybox() -> Result> { println!("BusyBox v1.35.0 built-in shell (ash)\n"); Process::spawn_user_process(executable_path, argv, envp) } + +fn print_banner() { + println!("\x1B[36m"); + println!( + r" + __ __ .__ __. __ __ ___ ___ + | | | | | \ | | | | | | \ \ / / + | | | | | \| | | | | | \ V / +.--. | | | | | . ` | | | | | > < +| `--' | | | | |\ | | `--' | / . \ + \______/ |__| |__| \__| \______/ /__/ \__\ +" + ); + println!("\x1B[0m"); +} diff --git a/src/services/libs/jinux-std/src/process/program_loader/elf/load_elf.rs b/src/services/libs/jinux-std/src/process/program_loader/elf/load_elf.rs index 4737c00f..1a607e81 100644 --- a/src/services/libs/jinux-std/src/process/program_loader/elf/load_elf.rs +++ b/src/services/libs/jinux-std/src/process/program_loader/elf/load_elf.rs @@ -145,6 +145,7 @@ pub fn map_segment_vmos(elf: &Elf, root_vmar: &Vmar, elf_file: &Dentry) -> .get_type() .map_err(|_| Error::with_message(Errno::ENOEXEC, "parse program header type fails"))?; if type_ == program::Type::Load { + check_segment_align(program_header)?; let vmo = init_segment_vmo(program_header, elf_file)?; map_segment_vmo(program_header, vmo, root_vmar, base_addr)?; } @@ -215,7 +216,6 @@ fn init_segment_vmo(program_header: &ProgramHeader64, elf_file: &Dentry) -> Resu let file_offset = program_header.offset as usize; let virtual_addr = program_header.virtual_addr as usize; debug_assert!(file_offset % PAGE_SIZE == virtual_addr % PAGE_SIZE); - let page_cache_vmo = { let vnode = elf_file.vnode(); vnode.page_cache().ok_or(Error::with_message( @@ -271,3 +271,20 @@ fn parse_segment_perm(flags: xmas_elf::program::Flags) -> VmPerm { } vm_perm } + +fn check_segment_align(program_header: &ProgramHeader64) -> Result<()> { + let align = program_header.align; + if align == 0 || align == 1 { + // no align requirement + return Ok(()); + } + debug_assert!(align.is_power_of_two()); + if !align.is_power_of_two() { + return_errno_with_message!(Errno::ENOEXEC, "segment align is invalid."); + } + debug_assert!(program_header.offset % align == program_header.virtual_addr % align); + if program_header.offset % align != program_header.virtual_addr % align { + return_errno_with_message!(Errno::ENOEXEC, "segment align is not satisfied."); + } + Ok(()) +}