greatbridf %!s(int64=4) %!d(string=hai) anos
pai
achega
6b2fab4ef6
Modificáronse 7 ficheiros con 78 adicións e 15 borrados
  1. 21 1
      CMakeLists.txt
  2. 8 0
      include/asm/boot.h
  3. 1 0
      include/kernel_main.h
  4. 11 0
      include/types/stdint.h
  5. 22 0
      ldscript.ld
  6. 7 14
      src/boot.s
  7. 8 0
      src/kernel_main.c

+ 21 - 1
CMakeLists.txt

@@ -1,9 +1,10 @@
 cmake_minimum_required(VERSION 3.15)
 project(my_os_bootloader ASM)
 
-set(CMAKE_CXX_FLAGS "-nostdinc -m32 -nostdlib")
 set(CMAKE_ASM_FLAGS "-m32")
 
+include_directories(${PROJECT_SOURCE_DIR}/include)
+
 set(EXTRACT_DIR ${PROJECT_BINARY_DIR}/extract)
 file(MAKE_DIRECTORY ${EXTRACT_DIR})
 
@@ -17,8 +18,27 @@ add_custom_command(OUTPUT extracted_bootloader
     COMMAND ar xf ${PROJECT_BINARY_DIR}/libbootloader.a --output=${EXTRACT_DIR}
 )
 
+project(kernel_main)
+
+set(CMAKE_C_FLAGS "-nostdinc -m32 -nostdlib -Wall -O -fverbose-asm -fno-exceptions -fno-pic")
+
+include_directories(${PROJECT_SOURCE_DIR}/include)
+
+set(KERNEL_MAIN_SOURCES src/kernel_main.c
+                        include/asm/boot.h
+                        include/types/stdint.h
+                        include/kernel_main.h
+                        )
+add_library(kernel_main STATIC ${KERNEL_MAIN_SOURCES})
+
+add_custom_command(OUTPUT extracted_kernel_main
+    DEPENDS kernel_main
+    COMMAND ar xf ${PROJECT_BINARY_DIR}/libkernel_main.a --output=${EXTRACT_DIR}
+)
+
 add_custom_target(boot.img
     DEPENDS extracted_bootloader
+    DEPENDS extracted_kernel_main
     COMMAND ld -T ${CMAKE_SOURCE_DIR}/ldscript.ld ${EXTRACT_DIR}/*.o
     -melf_i386 --oformat=binary -o ${CMAKE_BINARY_DIR}/boot.img
 )

+ 8 - 0
include/asm/boot.h

@@ -0,0 +1,8 @@
+#include <types/stdint.h>
+
+struct gdt_descriptor {
+    uint16_t size;
+    uint32_t address;
+};
+
+extern struct gdt_descriptor asm_gdt_descriptor;

+ 1 - 0
include/kernel_main.h

@@ -0,0 +1 @@
+void kernel_main(void);

+ 11 - 0
include/types/stdint.h

@@ -0,0 +1,11 @@
+#pragma once
+
+typedef __INT8_TYPE__ int8_t;
+typedef __INT16_TYPE__ int16_t;
+typedef __INT32_TYPE__ int32_t;
+typedef __INT64_TYPE__ int64_t;
+
+typedef __UINT8_TYPE__ uint8_t;
+typedef __UINT16_TYPE__ uint16_t;
+typedef __UINT32_TYPE__ uint32_t;
+typedef __UINT64_TYPE__ uint64_t;

+ 22 - 0
ldscript.ld

@@ -1,9 +1,31 @@
 OUTPUT_FORMAT(binary)
+OUTPUT_ARCH(i386:i386)
 
 SECTIONS
 {
     .text :
     {
         *(.text*)
+        *(.rodata)
+    }
+
+    .data :
+    {
+        *(.data)
+    }
+
+    .bss :
+    {
+        *(.bss)
+    }
+
+    .end : AT(0x0ffffff)
+    {
+        BYTE(0x00);
+    }
+
+    /DISCARD/ :
+    {
+        *(.comment)
     }
 }

+ 7 - 14
src/boot.s

@@ -78,18 +78,15 @@ start_32bit:
     movw %ax, %ss
 
 # set up stack
-    movl $0x03ffffff, %ebp
-    movl $0x03ffffff, %esp
+    movl $0x003fffff, %ebp
+    movl $0x003fffff, %esp
 
 # breakpoint
 #ifdef _DEBUG
     xchgw %bx, %bx
 #endif
 
-# load gdt
-    cli
-    lgdt (gdt_descriptor-loader_start)
-    nop
+    call kernel_main
 
 loader_halt:
     hlt
@@ -107,7 +104,7 @@ asm_gdt_table:
     .8byte 0         # null descriptor
 
     # code segment
-    .word 0x1000     # limit 0 :15
+    .word 0x03ff     # limit 0 :15
     .word 0x0000     # base  0 :15
     .byte 0x00       # base  16:23
     .byte 0x9a       # access
@@ -115,13 +112,9 @@ asm_gdt_table:
     .byte 0x00       # base 24:31
 
     # data segment
-    .word 0x1000     # limit 0 :15
+    .word 0x03ff     # limit 0 :15
     .word 0x0000     # base  0 :15
-    .byte 0x00       # base  16:23
+    .byte 0x40       # base  16:23
     .byte 0x92       # access
     .byte 0b11000000 # flag and limit 16:20
-    .byte 0x04       # base 24:31
-
-.space (512 * 31) - (.-loader_start)
-
-.space (512 * 2016) # fill 1m
+    .byte 0x00       # base 24:31

+ 8 - 0
src/kernel_main.c

@@ -0,0 +1,8 @@
+#include <kernel_main.h>
+
+void kernel_main(void)
+{
+    asm volatile("xchgw %bx, %bx"); // magic breakpoint
+_loop:
+    goto _loop;
+}