Browse Source

Merge branch 'new_mem_allocation'

greatbridf 2 years ago
parent
commit
a0c10918b1
5 changed files with 30 additions and 8 deletions
  1. 3 0
      include/asm/boot.h
  2. 11 2
      ldscript.ld
  3. 1 1
      src/boot.s
  4. 6 5
      src/kernel/mem.c
  5. 9 0
      src/kernel_main.c

+ 3 - 0
include/asm/boot.h

@@ -21,3 +21,6 @@ extern uint32_t asm_e820_mem_map_count;
 extern uint32_t asm_e820_mem_map_entry_size;
 
 extern uint32_t asm_kernel_size;
+
+extern uint32_t bss_section_start_addr;
+extern uint32_t bss_section_end_addr;

+ 11 - 2
ldscript.ld

@@ -22,7 +22,7 @@ SECTIONS
     .text.loader 0x7e00 : AT(0x200)
     {
         *(.text.loader)
-        __kernel_size_offset = .;
+        __kernel_text_and_data_size_offset = .;
         LONG(LOADADDR(.data) - LOADADDR(.text));
         __loader_end = .;
     } > WHOLE
@@ -36,8 +36,14 @@ SECTIONS
 
     .data : AT(LOADADDR(.text) + ADDR(.data) - ADDR(.text))
     {
+        kernel_text_and_data_size = .;
+        LONG(__kernel_text_and_data_end - ADDR(.text));
         asm_kernel_size = .;
         LONG(__real_kernel_end - ADDR(.text));
+        bss_section_start_addr = .;
+        LONG(ABSOLUTE(__bss_start));
+        bss_section_end_addr = .;
+        LONG(ABSOLUTE(__bss_end));
 
         start_ctors = .;
         KEEP(*(.init_array));
@@ -46,12 +52,15 @@ SECTIONS
 
         *(.data)
         *(.data*)
+        __kernel_text_and_data_end = .;
     } > WHOLE
 
-    .bss :
+    .bss ALIGN(0x1000) :
     {
+        __bss_start = .;
         *(.bss)
         *(.bss*)
+        __bss_end = ALIGN(0x1000);
     } > WHOLE
 
     .kernel_end :

+ 1 - 1
src/boot.s

@@ -230,7 +230,7 @@ start_move_kernel:
     movl $__loader_end, %eax
     movl $__real_kernel_start, %ebx
 
-    movl $__kernel_size_offset, %ecx
+    movl $__kernel_text_and_data_size_offset, %ecx
     movl (%ecx), %ecx
     addl $__loader_end, %ecx
     movl (%ecx), %ecx

+ 6 - 5
src/kernel/mem.c

@@ -188,9 +188,6 @@ void* p_ptr_to_v_ptr(phys_ptr_t p_ptr)
 
 phys_ptr_t l_ptr_to_p_ptr(struct mm* mm, linr_ptr_t v_ptr)
 {
-    if (mm == kernel_mm_head && v_ptr < (linr_ptr_t)KERNEL_IDENTICALLY_MAPPED_AREA_LIMIT) {
-        return (phys_ptr_t)v_ptr;
-    }
     while (mm != NULL) {
         if (v_ptr < mm->start || v_ptr >= mm->start + mm->len * 4096) {
             goto next;
@@ -208,6 +205,9 @@ phys_ptr_t l_ptr_to_p_ptr(struct mm* mm, linr_ptr_t v_ptr)
 
 phys_ptr_t v_ptr_to_p_ptr(void* v_ptr)
 {
+    if (v_ptr < KERNEL_IDENTICALLY_MAPPED_AREA_LIMIT) {
+        return (phys_ptr_t)v_ptr;
+    }
     return l_ptr_to_p_ptr(kernel_mm_head, (linr_ptr_t)v_ptr);
 }
 
@@ -259,7 +259,8 @@ page_t alloc_raw_page(void)
             return i;
         }
     }
-    return GB_FAILED;
+    MAKE_BREAK_POINT();
+    return 0xffffffff;
 }
 
 struct page* allocate_page(void)
@@ -339,7 +340,7 @@ struct page* find_page_by_l_ptr(struct mm* mm, linr_ptr_t l_ptr)
     return NULL;
 }
 
-void map_raw_page_to_pte(
+static inline void map_raw_page_to_pte(
     page_table_entry* pte,
     page_t page,
     int rw,

+ 9 - 0
src/kernel_main.c

@@ -127,11 +127,20 @@ void load_new_gdt(void)
     asm_cli();
 }
 
+void init_bss_section(void)
+{
+    void* bss_addr = bss_section_start_addr;
+    size_t bss_size = bss_section_end_addr - bss_section_start_addr;
+    memset(bss_addr, 0x00, bss_size);
+}
+
 void kernel_main(void)
 {
     // MAKE_BREAK_POINT();
     asm_enable_sse();
 
+    init_bss_section();
+
     save_loader_data();
 
     load_new_gdt();