瀏覽代碼

style: add sections

greatbridf 2 年之前
父節點
當前提交
bfcf1567b6
共有 6 個文件被更改,包括 84 次插入42 次删除
  1. 3 3
      include/asm/boot.h
  2. 0 1
      include/kernel/mem.h
  3. 5 6
      src/boot.s
  4. 72 25
      src/kernel.ld
  5. 3 3
      src/kernel/mem.cpp
  6. 1 4
      src/kinit.cpp

+ 3 - 3
include/asm/boot.h

@@ -18,7 +18,7 @@ extern uint8_t asm_e820_mem_map[1024];
 extern uint32_t asm_e820_mem_map_count;
 extern uint32_t asm_e820_mem_map_entry_size;
 
-extern uint32_t asm_kernel_size;
+extern const uint32_t kernel_size;
 
-extern uint32_t bss_section_start_addr;
-extern uint32_t bss_section_end_addr;
+extern char* const bss_addr;
+extern const uint32_t bss_len;

+ 0 - 1
include/kernel/mem.h

@@ -92,7 +92,6 @@ typedef pte_t (*pt_t)[1024];
 inline uint8_t e820_mem_map[1024];
 inline uint32_t e820_mem_map_count;
 inline uint32_t e820_mem_map_entry_size;
-inline size_t kernel_size;
 inline struct mem_size_info mem_size_info;
 
 #define KERNEL_HEAP_START ((void*)0x30000000)

+ 5 - 6
src/boot.s

@@ -1,4 +1,4 @@
-.section .text.loader
+.section .stage1
 .code16
 loader_start:
 # set segment registers
@@ -173,12 +173,11 @@ _fill_zero_end:
 
 start_move_kernel:
 # move the kernel to 0x100000
-    movl $__loader_end, %eax
-    movl $__real_kernel_start, %ebx
+    movl $__stage1_end, %eax
+    movl $__kinit_start, %ebx
 
-    movl $__p_kernel_text_and_data_size_addr, %ecx
-    movl (%ecx), %ecx
-    movl (%ecx), %ecx
+    movl $__data_end, %ecx
+    subl $__kinit_start, %ecx
 
 _move_kernel:
     movl (%eax), %edx

+ 72 - 25
src/kernel.ld

@@ -8,29 +8,26 @@ MEMORY
 
 SECTIONS
 {
-    .text.loader 0x7e00 : AT(0x00000000)
+    .stage1 0x7e00 : AT(0x00000000)
     {
-        *(.text.loader)
-        __p_kernel_text_and_data_size_addr = .;
-        LONG(__loader_end + kernel_text_and_data_size - __real_kernel_start);
-        __loader_end = .;
+        __stage1_start = .;
+        *(.stage1)
+
+        . = ALIGN(0x100);
+        __stage1_end = .;
     } > MEM
 
-    .text 0x100000 : AT(LOADADDR(.text.loader) + SIZEOF(.text.loader))
+    .kinit 0x100000 :
+        AT(LOADADDR(.stage1) + SIZEOF(.stage1))
     {
-        __real_kernel_start = .;
-        *(.text*)
-        *(.rodata*)
+        __kinit_start = .;
+        *(.text.kinit)
 
-        . = ALIGN(4);
-        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));
+        LONG(0x00000000)
+        LONG(0x19191919)
+        LONG(0x00000000)
+
+        *(.rodata.kinit)
 
         start_ctors = .;
         KEEP(*(.init_array));
@@ -39,12 +36,66 @@ SECTIONS
         KEEP(*(SORT_BY_INIT_PRIORITY(.ctors*)));
         end_ctors = .;
 
+        LONG(0x00000000)
+        LONG(0x19191919)
+        LONG(0x00000000)
+
+        *(.data.kinit)
+
+        LONG(0x00000000)
+        LONG(0x19191919)
+        LONG(0x00000000)
+
+        *(.bss.kinit)
+
+        LONG(0x00000000)
+        LONG(0x19191919)
+        LONG(0x00000000)
+
+        . = ALIGN(0x1000);
+        __kinit_end = .;
+    } > MEM
+
+    .text :
+        AT(LOADADDR(.kinit) + SIZEOF(.kinit))
+    {
+        __text_start = .;
+        *(.text)
+        *(.text*)
+
+        . = ALIGN(0x1000);
+        __text_end = .;
+    } > MEM
+
+    .rodata :
+        AT(LOADADDR(.text) + SIZEOF(.text))
+    {
+        __rodata_start = .;
+        *(.rodata)
+        *(.rodata*)
+
+        bss_addr = .;
+        LONG(ABSOLUTE(__bss_start));
+        bss_len = .;
+        LONG(__bss_end - __bss_start);
+        kernel_size = .;
+        LONG(__data_end - __kinit_start);
         __stack_chk_guard = .;
         LONG(0x19198101);
 
+        . = ALIGN(0x1000);
+        __rodata_end = .;
+    } > MEM
+
+    .data :
+        AT(LOADADDR(.rodata) + SIZEOF(.rodata))
+    {
+        __data_start = .;
         *(.data)
         *(.data*)
-        __kernel_text_and_data_end = .;
+
+        . = ALIGN(0x1000);
+        __data_end = .;
     } > MEM
 
     .bss ALIGN(0x1000) :
@@ -52,12 +103,9 @@ SECTIONS
         __bss_start = .;
         *(.bss)
         *(.bss*)
-        __bss_end = ALIGN(0x1000);
-    } > MEM
 
-    .kernel_end :
-    {
-        __real_kernel_end = .;
+        . = ALIGN(0x1000);
+        __bss_end = .;
     } > MEM
 
     /* Stabs debugging sections.  */
@@ -98,7 +146,6 @@ SECTIONS
     {
         *(.fini_array*)
         *(.eh_frame*)
-        *(.text.bootsect)
         *(.note*)
     }
 }

+ 3 - 3
src/kernel/mem.cpp

@@ -192,7 +192,7 @@ public:
 
 static brk_memory_allocator* kernel_heap_allocator;
 static brk_memory_allocator
-    kernel_ident_mapped_allocator((void*)bss_section_end_addr,
+    kernel_ident_mapped_allocator(bss_addr + bss_len,
         IDENTICALLY_MAPPED_HEAP_SIZE);
 
 void* k_malloc(size_t size)
@@ -360,9 +360,9 @@ static inline void init_mem_layout(void)
     // mark EBDA and upper memory as allocated
     mark_addr_range(0x80000, 0xfffff);
     // mark kernel
-    mark_addr_len(0x00100000, kernel_size);
+    mark_addr_len(0x00100000, kernel_size + bss_len);
     // mark identically mapped heap
-    mark_addr_len(bss_section_end_addr, IDENTICALLY_MAPPED_HEAP_SIZE);
+    mark_addr_len((pptr_t)bss_addr + bss_len, IDENTICALLY_MAPPED_HEAP_SIZE);
 
     if (e820_mem_map_entry_size == 20) {
         struct e820_mem_map_entry_20* entry = (struct e820_mem_map_entry_20*)e820_mem_map;

+ 1 - 4
src/kinit.cpp

@@ -40,7 +40,6 @@ static inline void save_loader_data(void)
     memcpy(e820_mem_map, asm_e820_mem_map, sizeof(e820_mem_map));
     e820_mem_map_count = asm_e820_mem_map_count;
     e820_mem_map_entry_size = asm_e820_mem_map_entry_size;
-    kernel_size = asm_kernel_size;
     memcpy(&mem_size_info, &asm_mem_size_info, sizeof(struct mem_size_info));
 }
 
@@ -104,9 +103,7 @@ void load_new_gdt(void)
 
 void init_bss_section(void)
 {
-    void* bss_addr = (void*)bss_section_start_addr;
-    size_t bss_size = bss_section_end_addr - bss_section_start_addr;
-    memset(bss_addr, 0x00, bss_size);
+    memset(bss_addr, 0x00, bss_len);
 }
 
 int init_console(const char* name)