Sfoglia il codice sorgente

refactor: move bss initialization to kernel_main

greatbridf 2 anni fa
parent
commit
e083913ad7
4 ha cambiato i file con 24 aggiunte e 3 eliminazioni
  1. 3 0
      include/asm/boot.h
  2. 11 2
      ldscript.ld
  3. 1 1
      src/boot.s
  4. 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

+ 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();