diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-11-04 12:00:29 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-11-04 12:04:35 +0100 |
commit | 19398cd7d586bc3500ce63486ac10bde5c4489a9 (patch) | |
tree | feb6a5ac4e443d7f7543b6ffcd9e4b4c2a1a7420 /Kernel/VM/MemoryManager.cpp | |
parent | ea4e02ed86a5db8b9f57fd2fcdeb78a3142f3ccc (diff) | |
download | serenity-19398cd7d586bc3500ce63486ac10bde5c4489a9.zip |
Kernel: Reorganize memory layout a bit
Move the kernel image to the 1 MB physical mark. This prevents it from
colliding with stuff like the VGA memory. This was causing us to end
up with the BIOS screen contents sneaking into kernel memory sometimes.
This patch also bumps the kmalloc heap size from 1 MB to 3 MB. It's not
the perfect permanent solution (obviously) but it should get the OOM
monkey off our backs for a while.
Diffstat (limited to 'Kernel/VM/MemoryManager.cpp')
-rw-r--r-- | Kernel/VM/MemoryManager.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 0b86ecea41..475d9015bc 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -22,6 +22,7 @@ MemoryManager& MM MemoryManager::MemoryManager() { + // FIXME: Hard-coding these is stupid. Find a better way. m_kernel_page_directory = PageDirectory::create_at_fixed_address(PhysicalAddress(0x4000)); m_page_table_zero = (PageTableEntry*)0x6000; m_page_table_one = (PageTableEntry*)0x7000; @@ -61,25 +62,31 @@ void MemoryManager::initialize_paging() map_protected(VirtualAddress(0), PAGE_SIZE); #ifdef MM_DEBUG - dbgprintf("MM: Identity map bottom 5MB\n"); + dbgprintf("MM: Identity map bottom 8MB\n"); #endif - // The bottom 5 MB (except for the null page) are identity mapped & supervisor only. + // The bottom 8 MB (except for the null page) are identity mapped & supervisor only. // Every process shares these mappings. - create_identity_mapping(kernel_page_directory(), VirtualAddress(PAGE_SIZE), (5 * MB) - PAGE_SIZE); + create_identity_mapping(kernel_page_directory(), VirtualAddress(PAGE_SIZE), (8 * MB) - PAGE_SIZE); - // Basic memory map: - // 0 -> 512 kB Kernel code. Root page directory & PDE 0. - // (last page before 1MB) Used by quickmap_page(). - // 1 MB -> 3 MB kmalloc_eternal() space. - // 3 MB -> 4 MB kmalloc() space. - // 4 MB -> 5 MB Supervisor physical pages (available for allocation!) - // 5 MB -> 0xc0000000 Userspace physical pages (available for allocation!) - // 0xc0000000-0xffffffff Kernel-only virtual address space + // FIXME: We should move everything kernel-related above the 0xc0000000 virtual mark. + + // Basic physical memory map: + // 0 -> 1 MB We're just leaving this alone for now. + // 1 -> 3 MB Kernel image. + // (last page before 2MB) Used by quickmap_page(). + // 2 MB -> 4 MB kmalloc_eternal() space. + // 4 MB -> 7 MB kmalloc() space. + // 7 MB -> 8 MB Supervisor physical pages (available for allocation!) + // 8 MB -> MAX Userspace physical pages (available for allocation!) + + // Basic virtual memory map: + // 0 MB -> 8MB Identity mapped. + // 0xc0000000-0xffffffff Kernel-only virtual address space. #ifdef MM_DEBUG dbgprintf("MM: Quickmap will use %p\n", m_quickmap_addr.get()); #endif - m_quickmap_addr = VirtualAddress((1 * MB) - PAGE_SIZE); + m_quickmap_addr = VirtualAddress((2 * MB) - PAGE_SIZE); RefPtr<PhysicalRegion> region; bool region_is_super = false; @@ -126,9 +133,9 @@ void MemoryManager::initialize_paging() for (size_t page_base = mmap->addr; page_base < (mmap->addr + mmap->len); page_base += PAGE_SIZE) { auto addr = PhysicalAddress(page_base); - if (page_base < 4 * MB) { + if (page_base < 7 * MB) { // nothing - } else if (page_base >= 4 * MB && page_base < 5 * MB) { + } else if (page_base >= 7 * MB && page_base < 8 * MB) { if (region.is_null() || !region_is_super || region->upper().offset(PAGE_SIZE) != addr) { m_super_physical_regions.append(PhysicalRegion::create(addr, addr)); region = m_super_physical_regions.last(); |