Pārlūkot izejas kodu

change stage1 start addr to 0x8000

greatbridf 2 gadi atpakaļ
vecāks
revīzija
b2aa149ae2
3 mainītis faili ar 51 papildinājumiem un 42 dzēšanām
  1. 47 38
      src/boot.s
  2. 2 2
      src/kernel.ld
  3. 2 2
      src/mbr.S

+ 47 - 38
src/boot.s

@@ -103,22 +103,27 @@ start_32bit:
     movw %ax, %gs
     movw %ax, %ss
 
-# set up temporary stack
-    movl $0x7df0, %esp
-    movl $0x7df0, %ebp
-    movl $0x0, (%esp)
-    movl $0x0, 4(%esp)
+    movl $0, %esp
+    movl $0, %ebp
 
 setup_early_kernel_page_table:
 # memory map:
 # 0x0000-0x1000: empty page
 # 0x1000-0x2000: early kernel pd
-# 0x2000-0x5000: 3 pts
-# 0x5000-0x7000: early kernel stack
-# so we fill the first 7KiB with zero
+# 0x2000-0x6000: 4 pts
+# 0x6000-0x8000: early kernel stack
+# so we fill the first 8KiB with zero
     movl $0x00000000, %eax
-    movl $0x7000, %ecx
-    call _fill_zero
+    movl $0x8000, %ecx
+
+_fill_zero:
+    cmpl $0, %ecx
+    jz _fill_zero_end
+    subl $4, %ecx
+    movl $0, (%eax)
+    addl $4, %eax
+    jmp _fill_zero
+_fill_zero_end:
 
 # pt#0: 0x00000000 to 0x00400000
     movl $0x00001000, %eax
@@ -126,25 +131,28 @@ setup_early_kernel_page_table:
 # pt#1: 0xc0000000 to 0xc0400000
     movl $0x00001c00, %eax
     movl $0x00003003, (%eax)
-# pt#2: 0xffc00000 to 0xffffffff
-    movl $0x00001ffc, %eax
+# pt#2: 0xff000000 to 0xff400000
+    movl $0x00001ff0, %eax
     movl $0x00004003, (%eax)
+# pt#3: 0xffc00000 to 0xffffffff
+    movl $0x00001ffc, %eax
+    movl $0x00005003, (%eax)
 
-# map early kernel page directory identically
-    movl $0x00002004, %eax
+# map early kernel page directory to 0xff000000
+    movl $0x00004000, %eax
     movl $0x00001003, (%eax)
 
+# map kernel pt#2 to 0xff001000
+    movl $0x00004004, %eax
+    movl $0x00004003, (%eax)
+
 # map __stage1_start ---- __kinit_end identically
     movl $__stage1_start, %ebx
-    shrl $12, %ebx
+    movl $__kinit_end, %ecx
     movl %ebx, %edx
+    shrl $12, %edx
     andl $0x3ff, %edx
-    shll $12, %ebx
 
-    movl $__kinit_end, %ecx
-    addl $0xfff, %ecx
-    shrl $12, %ecx
-    shll $12, %ecx
 
 __map_stage1_kinit:
     leal 3(%ebx), %eax
@@ -154,13 +162,13 @@ __map_stage1_kinit:
     cmpl %ebx, %ecx
     jne __map_stage1_kinit
 
-# map __text_start ---- __bss_end to 0xc0000000
+# map __text_start ---- __data_end to 0xc0000000
     movl %ecx, %ebx
     movl $__text_start, %edx
     shrl $12, %edx
     andl $0x3ff, %edx
 
-    movl $__bss_end, %ecx
+    movl $__data_end, %ecx
     subl $__text_start, %ecx
     addl %ebx, %ecx
 
@@ -172,15 +180,29 @@ __map_kernel_space:
     cmpl %ebx, %ecx
     jne __map_kernel_space
 
+# map __data_end ---- __bss_end from 0x100000
+    movl $0x100000, %ebx
+    movl $__bss_end, %ecx
+    subl $__data_end, %ecx
+    addl %ebx, %ecx
+
+__map_kernel_bss:
+    leal 3(%ebx), %eax
+    movl %eax, 0x00003000(, %edx, 4)
+    addl $0x1000, %ebx
+    incl %edx
+    cmpl %ebx, %ecx
+    jne __map_kernel_bss
+
 # map kernel stack 0xffffe000-0xffffffff
-    movl $0x5000, %ebx
-    movl $0x7000, %ecx
+    movl $0x6000, %ebx
+    movl $0x8000, %ecx
     movl $0x0ffffe, %edx
     andl $0x3ff, %edx
 
 __map_kernel_stack:
     leal 3(%ebx), %eax
-    movl %eax, 0x00004000(, %edx, 4)
+    movl %eax, 0x00005000(, %edx, 4)
     addl $0x1000, %ebx
     incl %edx
     cmpl %ebx, %ecx
@@ -210,19 +232,6 @@ __stage1_halt:
     hlt
     jmp __stage1_halt
 
-# quick call
-# %eax: address to fill
-# %ecx: byte count to fill
-_fill_zero:
-    cmpl $0, %ecx
-    jz _fill_zero_end
-    subl $4, %ecx
-    movl $0, (%eax)
-    addl $4, %eax
-    jmp _fill_zero
-_fill_zero_end:
-    ret
-
 asm_gdt_descriptor:
     .word (5 * 8) - 1 # size
     .long asm_gdt_table  # address

+ 2 - 2
src/kernel.ld

@@ -8,12 +8,12 @@ MEMORY
 
 SECTIONS
 {
-    .stage1 0x7e00 : AT(0x00000000)
+    .stage1 0x8000 : AT(0x00000000)
     {
         __stage1_start = .;
         *(.stage1)
 
-        . = ALIGN(0x100);
+        . = ALIGN(0x1000);
         __stage1_end = .;
     } > MEM
 

+ 2 - 2
src/mbr.S

@@ -26,7 +26,7 @@ mbr_start:
     call read_data
 
 # loader start
-    jmp 0x7e00
+    jmp 0x8000
 
 read_data:
     movw $read_data_pack, %si
@@ -48,7 +48,7 @@ read_data_count:
 read_data_offset:
     .word 0x0000 # offset address
 read_data_segment:
-    .word 0x07e0 # segment address
+    .word 0x0800 # segment address
 read_data_lba:
     .long 1      # lower 4 bytes of the LBA to read
     .long 0      # higher 2 bytes of the LBA to read