From 8024401bd2b48563fd763cfc24b250bb9b42f19f Mon Sep 17 00:00:00 2001 From: WangRunji Date: Tue, 30 Apr 2019 01:45:01 +0800 Subject: [PATCH] simplify x86_64 consts. keep MemoryArea order by start address --- crate/memory/src/memory_set/mod.rs | 10 +++- kernel/src/arch/x86_64/consts.rs | 96 +----------------------------- 2 files changed, 12 insertions(+), 94 deletions(-) diff --git a/crate/memory/src/memory_set/mod.rs b/crate/memory/src/memory_set/mod.rs index decd828..97d0ca3 100644 --- a/crate/memory/src/memory_set/mod.rs +++ b/crate/memory/src/memory_set/mod.rs @@ -310,7 +310,15 @@ impl MemorySet { name, }; self.page_table.edit(|pt| area.map(pt)); - self.areas.push(area); + // keep order by start address + let idx = self + .areas + .iter() + .enumerate() + .find(|(_, other)| start_addr < other.start_addr) + .map(|(i, _)| i) + .unwrap_or(self.areas.len()); + self.areas.insert(idx, area); } /* diff --git a/kernel/src/arch/x86_64/consts.rs b/kernel/src/arch/x86_64/consts.rs index 0b3a4f9..cd44eb2 100644 --- a/kernel/src/arch/x86_64/consts.rs +++ b/kernel/src/arch/x86_64/consts.rs @@ -1,96 +1,6 @@ -// Copy from Redox consts.rs: - -// Because the memory map is so important to not be aliased, it is defined here, in one place -// The lower 256 PML4 entries are reserved for userspace -// Each PML4 entry references up to 512 GB of memory -// The top (511) PML4 is reserved for recursive mapping -// The second from the top (510) PML4 is reserved for the kernel -/// The size of a single PML4 -pub const PML4_SIZE: usize = 0x0000_0080_0000_0000; -pub const PML4_MASK: usize = 0x0000_ff80_0000_0000; - -/// Offset of recursive paging -pub const RECURSIVE_PAGE_OFFSET: usize = (-(PML4_SIZE as isize)) as usize; -pub const RECURSIVE_PAGE_PML4: usize = (RECURSIVE_PAGE_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset of kernel -pub const KERNEL_OFFSET: usize = RECURSIVE_PAGE_OFFSET - PML4_SIZE; -pub const KERNEL_PML4: usize = (KERNEL_OFFSET & PML4_MASK) / PML4_SIZE; - -pub const KERNEL_SIZE: usize = PML4_SIZE; - -/// Offset to kernel heap -pub const KERNEL_HEAP_OFFSET: usize = KERNEL_OFFSET - PML4_SIZE; -pub const KERNEL_HEAP_PML4: usize = (KERNEL_HEAP_OFFSET & PML4_MASK) / PML4_SIZE; -/// Size of kernel heap -pub const KERNEL_HEAP_SIZE: usize = 32 * 1024 * 1024; // 32 MB - pub const MEMORY_OFFSET: usize = 0; +pub const KERNEL_OFFSET: usize = 0xffffff00_00000000; +pub const KERNEL_HEAP_SIZE: usize = 32 * 1024 * 1024; // 32 MB -/// Offset to kernel percpu variables -//TODO: Use 64-bit fs offset to enable this pub const KERNEL_PERCPU_OFFSET: usize = KERNEL_HEAP_OFFSET - PML4_SIZE; -pub const KERNEL_PERCPU_OFFSET: usize = 0xC000_0000; -/// Size of kernel percpu variables -pub const KERNEL_PERCPU_SIZE: usize = 64 * 1024; // 64 KB - -/// Offset to user image -pub const USER_OFFSET: usize = 0; -pub const USER_PML4: usize = (USER_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user TCB -pub const USER_TCB_OFFSET: usize = 0xB000_0000; - -/// Offset to user arguments -pub const USER_ARG_OFFSET: usize = USER_OFFSET + PML4_SIZE / 2; - -/// Offset to user heap -pub const USER_HEAP_OFFSET: usize = USER_OFFSET + PML4_SIZE; -pub const USER_HEAP_PML4: usize = (USER_HEAP_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user grants -pub const USER_GRANT_OFFSET: usize = USER_HEAP_OFFSET + PML4_SIZE; -pub const USER_GRANT_PML4: usize = (USER_GRANT_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user stack -pub const USER_STACK_OFFSET: usize = USER_GRANT_OFFSET + PML4_SIZE; -pub const USER_STACK_PML4: usize = (USER_STACK_OFFSET & PML4_MASK) / PML4_SIZE; -/// Size of user stack +pub const USER_STACK_OFFSET: usize = 0x00008000_00000000 - USER_STACK_SIZE; pub const USER_STACK_SIZE: usize = 8 * 1024 * 1024; // 8 MB, the default config of Linux - -/// Offset to user sigstack -pub const USER_SIGSTACK_OFFSET: usize = USER_STACK_OFFSET + PML4_SIZE; -pub const USER_SIGSTACK_PML4: usize = (USER_SIGSTACK_OFFSET & PML4_MASK) / PML4_SIZE; -/// Size of user sigstack -pub const USER_SIGSTACK_SIZE: usize = 256 * 1024; // 256 KB - -/// Offset to user TLS -pub const USER_TLS_OFFSET: usize = USER_SIGSTACK_OFFSET + PML4_SIZE; -pub const USER_TLS_PML4: usize = (USER_TLS_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user temporary image (used when cloning) -pub const USER_TMP_OFFSET: usize = USER_TLS_OFFSET + PML4_SIZE; -pub const USER_TMP_PML4: usize = (USER_TMP_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user temporary heap (used when cloning) -pub const USER_TMP_HEAP_OFFSET: usize = USER_TMP_OFFSET + PML4_SIZE; -pub const USER_TMP_HEAP_PML4: usize = (USER_TMP_HEAP_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user temporary page for grants -pub const USER_TMP_GRANT_OFFSET: usize = USER_TMP_HEAP_OFFSET + PML4_SIZE; -pub const USER_TMP_GRANT_PML4: usize = (USER_TMP_GRANT_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user temporary stack (used when cloning) -pub const USER_TMP_STACK_OFFSET: usize = USER_TMP_GRANT_OFFSET + PML4_SIZE; -pub const USER_TMP_STACK_PML4: usize = (USER_TMP_STACK_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user temporary sigstack (used when cloning) -pub const USER_TMP_SIGSTACK_OFFSET: usize = USER_TMP_STACK_OFFSET + PML4_SIZE; -pub const USER_TMP_SIGSTACK_PML4: usize = (USER_TMP_SIGSTACK_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset to user temporary tls (used when cloning) -pub const USER_TMP_TLS_OFFSET: usize = USER_TMP_SIGSTACK_OFFSET + PML4_SIZE; -pub const USER_TMP_TLS_PML4: usize = (USER_TMP_TLS_OFFSET & PML4_MASK) / PML4_SIZE; - -/// Offset for usage in other temporary pages -pub const USER_TMP_MISC_OFFSET: usize = USER_TMP_TLS_OFFSET + PML4_SIZE; -pub const USER_TMP_MISC_PML4: usize = (USER_TMP_MISC_OFFSET & PML4_MASK) / PML4_SIZE;