aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/drivers/serial/serial.c4
-rw-r--r--kernel/kernel/kernel.c4
-rw-r--r--kernel/mm/virtual_mm/virtual_mm.c36
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;
+}