Ver código fonte

fix: free stage1 and kinit

greatbridf 2 anos atrás
pai
commit
841e258a13
3 arquivos alterados com 20 adições e 13 exclusões
  1. 0 1
      src/kernel/hw/ata.cpp
  2. 1 1
      src/kernel/mem.cpp
  3. 19 11
      src/kernel/process.cpp

+ 0 - 1
src/kernel/hw/ata.cpp

@@ -200,7 +200,6 @@ static inline void mbr_part_probe(fs::inode* drive, uint16_t major, uint16_t min
 }
 
 // data: void (*func_to_call_next)(void)
-SECTION(".text.kinit")
 void hw::init_ata(void)
 {
     ata_pri = new hw::ata(ATA_PRIMARY_BUS_BASE);

+ 1 - 1
src/kernel/mem.cpp

@@ -337,7 +337,7 @@ void init_mem(void)
     init_mem_layout();
 
     // TODO: replace early kernel pd
-    kernel_mms = types::pnew<types::kernel_ident_allocator>(kernel_mms, 0x00001);
+    kernel_mms = types::pnew<types::kernel_ident_allocator>(kernel_mms, EARLY_KERNEL_PD_PAGE);
     auto heap_mm = kernel_mms->addarea(KERNEL_HEAP_START, true, true);
 
     // create empty_page struct

+ 19 - 11
src/kernel/process.cpp

@@ -204,16 +204,6 @@ void kernel_threadd_main(void)
 
 void NORETURN _kernel_init(void)
 {
-    // TODO: free kinit memory
-    //       we should do this before we create any process
-    //       or processes should share kernel space pt
-    // {
-    //     extern char __kinit_start[];
-    //     extern char __kinit_end[];
-    //     auto iter = kernel_mms->find(__kinit_start);
-    //     kernel_mms->unmap(iter);
-    // }
-
     // pid 2 is kernel thread daemon
     auto* proc = &procs->emplace(1)->value;
 
@@ -295,9 +285,27 @@ void k_new_thread(void (*func)(void*), void* data)
     kthreadd_new_thd_data = data;
 }
 
-SECTION(".text.kinit")
 void NORETURN init_scheduler(void)
 {
+    {
+        extern char __stage1_start[];
+        extern char __kinit_end[];
+
+        kernel::paccess pa(EARLY_KERNEL_PD_PAGE);
+        auto pd = (pd_t)pa.ptr();
+        assert(pd);
+        (*pd)[0].v = 0;
+
+        // free pt#0
+        __free_raw_page(0x00002);
+
+        // free .stage1 and .kinit
+        for (uint32_t i = ((uint32_t)__stage1_start >> 12);
+             i < ((uint32_t)__kinit_end >> 12); ++i) {
+            __free_raw_page(i);
+        }
+    }
+
     procs = new proclist;
     readythds = new readyqueue;