Parcourir la source

printk and put char

greatbridf il y a 4 ans
Parent
commit
6d4c446ddf
10 fichiers modifiés avec 85 ajouts et 15 suppressions
  1. 6 0
      CMakeLists.txt
  2. 0 0
      include/kernel/interrupt.h
  3. 1 0
      include/kernel/stdio.h
  4. 17 0
      include/kernel/vga.h
  5. 24 6
      ldscript.ld
  6. 8 9
      src/boot.s
  7. 0 0
      src/kernel/interrupt.c
  8. 0 0
      src/kernel/stdio.c
  9. 19 0
      src/kernel/vga.c
  10. 10 0
      src/kernel_main.c

+ 6 - 0
CMakeLists.txt

@@ -26,7 +26,13 @@ set(CMAKE_C_FLAGS "-nostdinc -m32 -nostdlib -Wall -O -fverbose-asm -fno-exceptio
 include_directories(${PROJECT_SOURCE_DIR}/include)
 include_directories(${PROJECT_SOURCE_DIR}/include)
 
 
 set(KERNEL_MAIN_SOURCES src/kernel_main.c
 set(KERNEL_MAIN_SOURCES src/kernel_main.c
+                        src/kernel/interrupt.c
+                        src/kernel/stdio.c
+                        src/kernel/vga.c
                         include/asm/boot.h
                         include/asm/boot.h
+                        include/kernel/interrupt.h
+                        include/kernel/stdio.h
+                        include/kernel/vga.h
                         include/types/stdint.h
                         include/types/stdint.h
                         include/kernel_main.h
                         include/kernel_main.h
                         )
                         )

+ 0 - 0
include/kernel/interrupt.h


+ 1 - 0
include/kernel/stdio.h

@@ -0,0 +1 @@
+#pragma once

+ 17 - 0
include/kernel/vga.h

@@ -0,0 +1,17 @@
+#pragma once
+#ifndef _KERNEL_VGA_H_
+#define _KERNEL_VGA_H_
+
+#include <types/stdint.h>
+
+struct vga_char {
+    int8_t c;
+    uint8_t color;
+};
+
+#define VGA_MEM ((struct vga_char*)0xb8000)
+
+void vga_put_char(struct vga_char* c);
+void vga_printk(const char* str, uint8_t color);
+
+#endif // _KERNEL_VGA_H_

+ 24 - 6
ldscript.ld

@@ -1,33 +1,51 @@
 OUTPUT_FORMAT(binary)
 OUTPUT_FORMAT(binary)
 OUTPUT_ARCH(i386:i386)
 OUTPUT_ARCH(i386:i386)
 
 
+MEMORY
+{
+    WHOLE : org = 0x00000000, l = 4M
+}
+
 SECTIONS
 SECTIONS
 {
 {
-    .text :
+    .text.bootsect : AT(0x00)
     {
     {
         *(.text.bootsect)
         *(.text.bootsect)
+    } > WHOLE
+
+    .magicnumber : AT(0x1fe)
+    {
+        BYTE(0x55);
+        BYTE(0xaa);
+    } > WHOLE
+
+    .text 0x600 : AT(0x200)
+    {
         *(.text.loader)
         *(.text.loader)
         *(.text*)
         *(.text*)
-        *(.rodata)
-    }
+        *(.rodata*)
+    } > WHOLE
 
 
     .data :
     .data :
     {
     {
         *(.data)
         *(.data)
-    }
+        *(.data*)
+    } > WHOLE
 
 
     .bss :
     .bss :
     {
     {
         *(.bss)
         *(.bss)
-    }
+        *(.bss*)
+    } > WHOLE
 
 
     .end : AT(0x0ffffff)
     .end : AT(0x0ffffff)
     {
     {
         BYTE(0x00);
         BYTE(0x00);
-    }
+    } > WHOLE
 
 
     /DISCARD/ :
     /DISCARD/ :
     {
     {
         *(.comment)
         *(.comment)
+        *(.debug*)
     }
     }
 }
 }

+ 8 - 9
src/boot.s

@@ -21,7 +21,7 @@ real_start:
 
 
     call read_data
     call read_data
 
 
-    ljmp $0x0050, $(loader_start-loader_start)
+    ljmp $0x0060, $(loader_start-loader_start)
 
 
 die:
 die:
     hlt
     hlt
@@ -41,16 +41,13 @@ read_data_pack:
     .byte 0x10, 0
     .byte 0x10, 0
     .word 16     # block count (read 8k)
     .word 16     # block count (read 8k)
     .word 0x0000 # offset address
     .word 0x0000 # offset address
-    .word 0x0050 # segment address
+    .word 0x0060 # segment address
     .long 1      # LBA to read
     .long 1      # LBA to read
 
 
 stack_edge:
 stack_edge:
 .space 128
 .space 128
 stack_base:
 stack_base:
 
 
-.space 510 - (.-_start)
-.word 0xaa55
-
 .section .text.loader
 .section .text.loader
 
 
 # loader
 # loader
@@ -69,7 +66,7 @@ loader_start:
     orl $1, %eax
     orl $1, %eax
     movl %eax, %cr0
     movl %eax, %cr0
 
 
-    ljmp $0x08, $0x0500 + (start_32bit-loader_start)
+    ljmp $0x08, $0x0600 + (start_32bit-loader_start)
 
 
 .code32
 .code32
 
 
@@ -77,6 +74,8 @@ start_32bit:
     movw $16, %ax
     movw $16, %ax
     movw %ax, %ds
     movw %ax, %ds
     movw %ax, %es
     movw %ax, %es
+    movw %ax, %fs
+    movw %ax, %gs
     movw %ax, %ss
     movw %ax, %ss
 
 
 # set up stack
 # set up stack
@@ -90,8 +89,8 @@ loader_halt:
     jmp loader_halt
     jmp loader_halt
 
 
 asm_gdt_descriptor:
 asm_gdt_descriptor:
-    .word (3 * 8) - 1 # size
-    .long 0x0500+(asm_gdt_table-loader_start)  # address
+    .word (4 * 8) - 1 # size
+    .long 0x0600+(asm_gdt_table-loader_start)  # address
 
 
 .globl asm_gdt_descriptor
 .globl asm_gdt_descriptor
 .type asm_gdt_descriptor @object
 .type asm_gdt_descriptor @object
@@ -111,7 +110,7 @@ asm_gdt_table:
     # data segment
     # data segment
     .word 0x03ff     # limit 0 :15
     .word 0x03ff     # limit 0 :15
     .word 0x0000     # base  0 :15
     .word 0x0000     # base  0 :15
-    .byte 0x40       # base  16:23
+    .byte 0x00       # base  16:23
     .byte 0x92       # access
     .byte 0x92       # access
     .byte 0b11000000 # flag and limit 16:20
     .byte 0b11000000 # flag and limit 16:20
     .byte 0x00       # base 24:31
     .byte 0x00       # base 24:31

+ 0 - 0
src/kernel/interrupt.c


+ 0 - 0
src/kernel/stdio.c


+ 19 - 0
src/kernel/vga.c

@@ -0,0 +1,19 @@
+#define _KERNEL_VGA_C_
+#include <kernel/vga.h>
+
+static struct vga_char* p_vga_head = VGA_MEM;
+
+void vga_put_char(struct vga_char* c)
+{
+    *p_vga_head = *c;
+    ++p_vga_head;
+}
+
+void vga_printk(const char* str, uint8_t color)
+{
+    struct vga_char s_c;
+    s_c.color = color;
+    while ((s_c.c = *(str++)) != 0x00) {
+        vga_put_char(&s_c);
+    }
+}

+ 10 - 0
src/kernel_main.c

@@ -1,12 +1,22 @@
 #include <kernel_main.h>
 #include <kernel_main.h>
 
 
 #include <asm/boot.h>
 #include <asm/boot.h>
+#include <kernel/vga.h>
 
 
 void kernel_main(void)
 void kernel_main(void)
 {
 {
     asm volatile("xchgw %bx, %bx"); // magic breakpoint
     asm volatile("xchgw %bx, %bx"); // magic breakpoint
     uint32_t result;
     uint32_t result;
     result = check_a20_on();
     result = check_a20_on();
+
+    if (result) {
+        vga_printk("ON", 0x0fU);
+    } else {
+        vga_printk("NOT ON", 0x0fU);
+    }
+
+    vga_printk("No work to do, halting...", 0x0fU);
+
 _loop:
 _loop:
     goto _loop;
     goto _loop;
 }
 }