diff options
-rw-r--r-- | kernel/drivers/serial/serial.c | 4 | ||||
-rw-r--r-- | kernel/kernel/kernel.c | 4 | ||||
-rw-r--r-- | kernel/mm/virtual_mm/virtual_mm.c | 36 |
3 files changed, 39 insertions, 5 deletions
diff --git a/kernel/drivers/serial/serial.c b/kernel/drivers/serial/serial.c index fa465da..aae1793 100644 --- a/kernel/drivers/serial/serial.c +++ b/kernel/drivers/serial/serial.c @@ -60,12 +60,12 @@ is_transmit_empty() } void -serial_write_char(const char a) +serial_write_char(const char chr) { while (is_transmit_empty() == 0) ; - outb(PORT, a); + outb(PORT, chr); } void diff --git a/kernel/kernel/kernel.c b/kernel/kernel/kernel.c index 7b05f65..fe75d7d 100644 --- a/kernel/kernel/kernel.c +++ b/kernel/kernel/kernel.c @@ -21,6 +21,7 @@ #include <mm/memory_map.h> #include <mm/multiboot.h> #include <mm/physical_mm.h> +#include <mm/virtual_mm.h> #include <kernel/halt.h> @@ -46,6 +47,9 @@ kernel_main(uint32_t magic, multiboot_info_t *multiboot_info) printk("\nKernel", "Started."); + uint32_t x = 0; + virtual_mm_allocate_page(&x); + exit(); halt(); /* If exit() fails (on real hardware) */ } diff --git a/kernel/mm/virtual_mm/virtual_mm.c b/kernel/mm/virtual_mm/virtual_mm.c index 1e85e0c..e53ff2b 100644 --- a/kernel/mm/virtual_mm/virtual_mm.c +++ b/kernel/mm/virtual_mm/virtual_mm.c @@ -26,7 +26,7 @@ extern uint32_t kernel_start; extern uint32_t kernel_end; -uint32_t page_directory[PAGE_DIRECTORY_SIZE]; +uint32_t initial_page_directory[PAGE_DIRECTORY_SIZE]; uint32_t initial_page_table[PAGE_TABLE_SIZE]; bool @@ -36,8 +36,38 @@ virtual_mm_allocate_page(uint32_t *pt_entry) if (!ptr) return false; - SET_FRAME(pt_entry, ptr); - ADD_ATTRIB(pt_entry, PTE_PRESENT); + ADD_ATTRIB(pt_entry, SET_PTE_FRAME((uint32_t) ptr)); + ADD_ATTRIB(pt_entry, SET_PTE_PRESENT(1)); return true; } + +bool +virtual_mm_free_page(uint32_t *pt_entry) +{ + void *ptr = (void *) GET_PTE_FRAME(pt_entry); + if (ptr) + physical_mm_free_block(ptr); + + *pt_entry = 0; + + return true; +} + +ALWAYS_INLINE uint32_t * +virtual_mm_lookup_table(uint32_t *page_table, uint32_t virtual_addr) +{ + if (page_table) + return &page_table[PAGE_TABLE_INDEX(virtual_addr)]; + + return NULL; +} + +ALWAYS_INLINE uint32_t * +virtual_mm_lookup_directory(uint32_t *page_directory, uint32_t virtual_addr) +{ + if (page_directory) + return &page_directory[PAGE_DIRECTORY_INDEX(virtual_addr)]; + + return NULL; +} |