Browse Source

修改一处常量定义 (#503)

* 修改一处常量定义

* 修复ELF加载程序对用户程序加载地址判断不正确的地方

---------

Co-authored-by: longjin <[email protected]>
Chiichen 1 year ago
parent
commit
5d549a76ab
2 changed files with 5 additions and 2 deletions
  1. 3 1
      kernel/src/arch/x86_64/mm/mod.rs
  2. 2 1
      kernel/src/libs/elf.rs

+ 3 - 1
kernel/src/arch/x86_64/mm/mod.rs

@@ -115,7 +115,9 @@ impl MemoryManagementArch for X86_64MMArch {
     /// 0xffff_8000_0000_0000
     const PHYS_OFFSET: usize = Self::PAGE_NEGATIVE_MASK + (Self::PAGE_ADDRESS_SIZE >> 1);
 
-    const USER_END_VADDR: VirtAddr = VirtAddr::new(0x0000_7eff_ffff_ffff);
+    // 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/arch/x86/include/asm/page_64_types.h#75
+    const USER_END_VADDR: VirtAddr =
+        VirtAddr::new((Self::PAGE_ADDRESS_SIZE >> 1) - Self::PAGE_SIZE);
     const USER_BRK_START: VirtAddr = VirtAddr::new(0x700000000000);
     const USER_STACK_START: VirtAddr = VirtAddr::new(0x6ffff0a00000);
 

+ 2 - 1
kernel/src/libs/elf.rs

@@ -651,7 +651,8 @@ impl BinaryLoader for ElfLoader {
             // 如果程序段要加载的目标地址不在用户空间内,或者是其他不合法的情况,那么就报错
             if !p_vaddr.check_user()
                 || seg_to_load.p_filesz > seg_to_load.p_memsz
-                || seg_to_load.p_memsz > MMArch::USER_END_VADDR.data() as u64
+                || self.elf_page_align_up(p_vaddr + seg_to_load.p_memsz as usize)
+                    >= MMArch::USER_END_VADDR
             {
                 // kdebug!("ERR:     p_vaddr={p_vaddr:?}");
                 return Err(ExecError::InvalidParemeter);