From 1aace858da49c9688965d904a5f758cecc07094b Mon Sep 17 00:00:00 2001 From: josh Date: Mon, 6 Jul 2009 21:48:04 +0000 Subject: [PATCH] Moved page_directory from an allocated object to a pointer to a run-time allocated page of RAM git-svn-id: svn://anubis/hos/trunk@42 5b3e749e-e535-0410-8002-a9bb6afbdfca --- kernel/mm/mm.cc | 33 +++++++++++++++++++++++---------- kernel/mm/mm.h | 5 +---- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/kernel/mm/mm.cc b/kernel/mm/mm.cc index ba15fec..c8a088a 100644 --- a/kernel/mm/mm.cc +++ b/kernel/mm/mm.cc @@ -8,8 +8,7 @@ static bool mm_use_virtual_offset; -pagedirectory_t page_directory __attribute__ ((aligned (4096))); - +static pagedirectory_entry_t * page_directory; static mm_mem_range_t mm_mmap_entries[MM_MAX_MMAP_ENTRIES]; static int mm_mmap_num_entries = 0; static int mm_num_free_pages = 0; @@ -108,10 +107,18 @@ void mm_bootstrap() k_early_panic("Not enough free pages of RAM!"); } + /* ok, now mm_page_alloc() should be functional */ + + /* allocate the page directory */ + u32_t page_directory_phys = mm_page_alloc(); + page_directory = (pagedirectory_entry_t *) page_directory_phys; + pagedirectory_entry_t * page_dir_virt = + (pagedirectory_entry_t *) (page_directory_phys + KERNEL_OFFSET); + /* Clear the page directory */ for (unsigned int i = 0; i < NUM_PAGETABLE_ENTRIES; i++) { - page_directory[i] = 0; + page_dir_virt[i] = 0; } /* @@ -135,7 +142,7 @@ void mm_bootstrap() } /* set the page directory base register */ - set_cr3(&page_directory); + set_cr3(page_directory); mm_use_virtual_offset = false; } @@ -149,7 +156,13 @@ int mm_map(u32_t virtual_address, u32_t physical_address, { u32_t directory_index = (virtual_address >> 22) & 0x3FF; u32_t table_index = (virtual_address >> 12) & 0x3FF; - if (page_directory[directory_index] == 0) + pagedirectory_entry_t * page_dir = page_directory; + if (mm_use_virtual_offset) + { + page_dir = (pagedirectory_entry_t *)((u32_t)page_dir + KERNEL_OFFSET); + } + + if (page_dir[directory_index] == 0) { /* allocate a new page table */ u32_t page_table_address = mm_page_alloc(); @@ -157,12 +170,12 @@ int mm_map(u32_t virtual_address, u32_t physical_address, { return 0; } - page_directory[directory_index] = page_table_address - | 0x1 << 2 /* PTs can be user mode */ - | 0x1 << 1 /* writable */ - | 0x1; /* present */ + page_dir[directory_index] = page_table_address + | 0x1 << 2 /* PTs can be user mode */ + | 0x1 << 1 /* writable */ + | 0x1; /* present */ } - u32_t page_table_address = page_directory[directory_index] & PAGE_HIGH_MASK; + u32_t page_table_address = page_dir[directory_index] & PAGE_HIGH_MASK; u32_t * page_table = (u32_t *) page_table_address; if (mm_use_virtual_offset) diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h index a7ef217..daa0eda 100644 --- a/kernel/mm/mm.h +++ b/kernel/mm/mm.h @@ -10,10 +10,7 @@ typedef u32_t pagedirectory_entry_t; #define NUM_PAGETABLE_ENTRIES (PAGE_SIZE / sizeof(pagedirectory_entry_t)) -typedef pagedirectory_entry_t - pagedirectory_t[NUM_PAGETABLE_ENTRIES]; - -extern pagedirectory_t page_directory; +typedef pagedirectory_entry_t pagedirectory_t[NUM_PAGETABLE_ENTRIES]; typedef struct {