diff options
-rw-r--r-- | kernel/include/mm/virtual_mm.h | 9 | ||||
-rw-r--r-- | kernel/mm/virtual_mm/virtual_mm.c | 16 |
2 files changed, 18 insertions, 7 deletions
diff --git a/kernel/include/mm/virtual_mm.h b/kernel/include/mm/virtual_mm.h index 849b370..58b8692 100644 --- a/kernel/include/mm/virtual_mm.h +++ b/kernel/include/mm/virtual_mm.h @@ -19,11 +19,13 @@ #ifndef __mm_virtual_mm_h #define __mm_virtual_mm_h +#include <common.h> #include <stdbool.h> #include <stdint.h> #define PAGE_DIRECTORY_SIZE 1024 #define PAGE_TABLE_SIZE 1024 +#define PAGE_SIZE (4 * KiB) #define PDE_PRESENT(x) x #define PDE_WRITABLE(x) ((x) << 1) @@ -88,9 +90,14 @@ void virtual_mm_initialize(void); void virtual_mm_map_page(void *physical_address, void *virtual_address); /* + * Unmap a page starting at virtual address + */ +void virtual_mm_unmap_page(void *virtual_address); + +/* * Find a virtual address with n consecutive free addresses. */ -uint32_t virtual_mm_find_free_virtual_addresses(uint32_t n_pages); +void *virtual_mm_find_free_virtual_addresses(uint32_t n_pages); /* * Allocate and map n pages. diff --git a/kernel/mm/virtual_mm/virtual_mm.c b/kernel/mm/virtual_mm/virtual_mm.c index 4acf7c7..4bdb4ab 100644 --- a/kernel/mm/virtual_mm/virtual_mm.c +++ b/kernel/mm/virtual_mm/virtual_mm.c @@ -138,7 +138,7 @@ virtual_mm_unmap_page(void *virtual_address) *pt_entry = 0; } -uint32_t +void * virtual_mm_find_free_virtual_addresses(uint32_t n) { /* Skip the first page directory, we don't wanna touch the first 4MiB. */ @@ -181,7 +181,8 @@ virtual_mm_find_free_virtual_addresses(uint32_t n) } if (++count == n) - return VIRTUAL_ADDRESS(starting_pd_index, starting_pt_index); + return (void *) VIRTUAL_ADDRESS(starting_pd_index, + starting_pt_index); } } } @@ -193,13 +194,16 @@ virtual_mm_find_free_virtual_addresses(uint32_t n) void * virtual_mm_alloc_pages(uint32_t n_pages) { - uint32_t starting_address = virtual_mm_find_free_virtual_addresses(n_pages); + uint32_t starting_address + = (uint32_t) virtual_mm_find_free_virtual_addresses(n_pages); if (starting_address == 0) return 0; - for (uint32_t i = 0; i < n_pages; i++) - virtual_mm_map_page(physical_mm_allocate_block(), - (void *) (starting_address + (i * 4096))); + for (uint32_t i = 0; i < n_pages; i++) { + void *virtual_address = (void *) (starting_address + (i * PAGE_SIZE)); + void *physical_address = physical_mm_allocate_block(); + virtual_mm_map_page(physical_address, virtual_address); + } return (void *) starting_address; } |