소스 검색

feat: move kernel to 0x100000

greatbridf 2 년 전
부모
커밋
4ad62d98cf
3개의 변경된 파일34개의 추가작업 그리고 5개의 파일을 삭제
  1. 1 1
      Makefile
  2. 14 3
      ldscript.ld
  3. 19 1
      src/boot.s

+ 1 - 1
Makefile

@@ -25,7 +25,7 @@ clean:
 
 .PHONY: debug
 debug:
-	gdb --symbols=build/kernel.out --init-eval-command 'target remote:1234' --eval-command 'hbr kernel_main' --eval-command 'c'
+	gdb --symbols=build/kernel.out --init-eval-command 'set pagination off' --init-eval-command 'target remote:1234' --eval-command 'hbr kernel_main' --eval-command 'c'
 
 build/boot.vdi: build/boot.img
 	-rm build/boot.vdi

+ 14 - 3
ldscript.ld

@@ -19,9 +19,17 @@ SECTIONS
         BYTE(0xaa);
     } > WHOLE
 
-    .text 0x7e00 : AT(0x200)
+    .text.loader 0x7e00 : AT(0x200)
     {
         *(.text.loader)
+        __kernel_size_offset = .;
+        LONG(LOADADDR(.data) - LOADADDR(.text));
+        __loader_end = .;
+    } > WHOLE
+
+    .text 0x100000 : AT(LOADADDR(.text.loader) + SIZEOF(.text.loader))
+    {
+        __real_kernel_start = .;
         *(.text*)
         *(.rodata*)
     } > WHOLE
@@ -29,7 +37,7 @@ SECTIONS
     .data :
     {
         kernel_size = .;
-        LONG(ADDR(.kernel_end) - ADDR(.text));
+        LONG(__real_kernel_end - ADDR(.text));
 
         start_ctors = .;
         KEEP(*(.init_array));
@@ -48,9 +56,10 @@ SECTIONS
 
     .kernel_end :
     {
+        __real_kernel_end = .;
     } > WHOLE
 
-	/* Stabs debugging sections.  */
+    /* Stabs debugging sections.  */
     .stab          0 : { *(.stab) }
     .stabstr       0 : { *(.stabstr) }
     .stab.excl     0 : { *(.stab.excl) }
@@ -89,8 +98,10 @@ SECTIONS
         BYTE(0x00);
     } > WHOLE
 
+/*
     /DISCARD/ :
     {
         *(.comment)
     }
+*/
 }

+ 19 - 1
src/boot.s

@@ -164,6 +164,24 @@ start_32bit:
     movl $0x03fffff0, %ebp
     movl $0x03fffff0, %esp
 
+# TODO: move REAL KERNEL to 0x100000
+    movl $__loader_end, %eax
+    movl $__real_kernel_start, %ebx
+
+    movl $__kernel_size_offset, %ecx
+    movl (%ecx), %ecx
+    addl $__loader_end, %ecx
+    movl (%ecx), %ecx
+
+_move_kernel:
+    movl (%eax), %edx
+    movl %edx, (%ebx)
+    addl $4, %eax
+    addl $4, %ebx
+    subl $4, %ecx
+    cmpl $0, %ecx
+    jge _move_kernel
+
     call kernel_main
 
 loader_halt:
@@ -205,7 +223,7 @@ asm_gdt_table:
     .byte 0b11001111 # flag and limit 16:20
     .byte 0x00       # base 24:31
 
-    # kernel data segment
+    # user data segment
     .word 0xffff     # limit 0 :15
     .word 0x0000     # base  0 :15
     .byte 0x00       # base  16:23