From 5d549a76ab0cf66651a6614be92dcb481fe7af2a Mon Sep 17 00:00:00 2001 From: Chiichen Date: Fri, 26 Jan 2024 20:45:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E5=A4=84=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E5=AE=9A=E4=B9=89=20(#503)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修改一处常量定义 * 修复ELF加载程序对用户程序加载地址判断不正确的地方 --------- Co-authored-by: longjin --- kernel/src/arch/x86_64/mm/mod.rs | 4 +++- kernel/src/libs/elf.rs | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/src/arch/x86_64/mm/mod.rs b/kernel/src/arch/x86_64/mm/mod.rs index 6341a91e..cc2abeab 100644 --- a/kernel/src/arch/x86_64/mm/mod.rs +++ b/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); diff --git a/kernel/src/libs/elf.rs b/kernel/src/libs/elf.rs index cff944a6..66695962 100644 --- a/kernel/src/libs/elf.rs +++ b/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);