Эх сурвалжийг харах

feat: initialize pd and pt

greatbridf 3 жил өмнө
parent
commit
3a9982a94d

+ 5 - 0
include/kernel/mem.h

@@ -103,6 +103,11 @@ typedef union page_table_entry {
     struct page_table_entry_in in;
 } page_table_entry;
 
+#define KERNEL_PAGE_DIRECTORY_ADDR ((page_directory_entry*)0x00000000)
+#define KERNEL_PAGE_TABLE_START_ADDR ((page_table_entry*)0x00100000)
+
+void init_paging(void);
+
 #ifdef __cplusplus
 }
 #endif

+ 30 - 0
src/kernel/mem.c

@@ -152,3 +152,33 @@ void k_free(void* ptr)
     blk->flags.is_free = 1;
     // TODO: fusion free blocks nearby
 }
+
+static inline void _create_pd(page_directory_entry* pde)
+{
+}
+
+static page_directory_entry* _kernel_pd = KERNEL_PAGE_DIRECTORY_ADDR;
+
+static inline void _create_kernel_pt(int32_t index)
+{
+    page_table_entry* pt = KERNEL_PAGE_TABLE_START_ADDR + index * 0x1000;
+    for (int32_t i = 0; i < 1024; ++i) {
+        pt[i].v = 0b00000011;
+        pt[i].in.addr = ((index * 0x400000) + i * 0x1000) >> 12;
+    }
+}
+
+static inline void _create_kernel_pd(void)
+{
+    for (int32_t i = 0; i < 1024; ++i) {
+        _kernel_pd[i].v = 0b00000011;
+        _kernel_pd[i].in.addr = ((uint32_t)(KERNEL_PAGE_TABLE_START_ADDR + i * 0x1000) >> 12);
+        _create_kernel_pt(i);
+    }
+}
+
+void init_paging(void)
+{
+    _create_kernel_pd();
+    asm("nop");
+}

+ 4 - 0
src/kernel_main.c

@@ -77,6 +77,10 @@ void kernel_main(void)
         }
     }
 
+    init_paging();
+
+    printkf("Paging enabled\n");
+
     printkf("Initializing interrupt descriptor table...\n");
 
     init_idt();