diff --git a/kernel/kernel.c b/kernel/kernel.c new file mode 100644 index 0000000..75af17c --- /dev/null +++ b/kernel/kernel.c @@ -0,0 +1,67 @@ +// fether os kernel. +#include +#include + +// protecting compilation. +#if defined(__linux__) + #error "You should compile all with a cross-compiler. See project wiki." +#elif !defined(__i386__) + #error "This is an 32bit kernel. Please use i386 target." +#endif + +volatile uint16_t* vga_buffer = (uint16_t*)0xB8000; // defining VGA text mode. + +// vga(2) settings +const int VGA_COLS = 80; +const int VGA_ROWS = 25; + +// terminal settings +int term_col = 0; +int term_row = 0; +uint8_t term_color = 0x0F; + +// clearing the terminal +void term_init() { + for(int col = 0; col < VGA_COLS; col++) { + for(int row = 0; row < VGA_ROWS; row++) { + const size_t index = (VGA_COLS * row) + col; + vga_buffer[index] = ((uint16_t)term_color << 8) | ' '; + } + } +} + +void term_put(char c) { + switch(c) { + case '\n': // newline implemintation + { + term_col = 0; + term_row++; + break; + } + default: // if char doesn't match any special symbol + { + const size_t index = (VGA_COLS * term_row) + term_col; + vga_buffer[index] = ((uint16_t)term_color << 8) | c; + break; + } + } + + if(term_col >= VGA_COLS) { + term_col = 0; + term_row++; + } + + + if(term_row >= VGA_ROWS) { + term_col = 0; + term_row = 0; + } +} + + +void term_print(const char* str) { for(size_t i = 0; str[i] != '\0'; i++) { term_put(str[i]); } } + +void kmain() { + term_init(); + term_print("Kernel loaded.\nFether."); +} diff --git a/kernel/linker.ld b/kernel/linker.ld new file mode 100644 index 0000000..4d6c890 --- /dev/null +++ b/kernel/linker.ld @@ -0,0 +1,24 @@ +{ + . = 1M; + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + } + .text BLOCK(4K) : ALIGN(4K) + { + *(.text) + } + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } +} diff --git a/kernel/start.s b/kernel/start.s new file mode 100644 index 0000000..731a1bc --- /dev/null +++ b/kernel/start.s @@ -0,0 +1,26 @@ +.extern kmain // entry +.global start +.set MB_MAGIC, 0x1BADB002 +.set MB_FLAGS, (1 << 0) | (1 << 1) +.set MB_CHECKSUM, (0 - (MB_MAGIC + MB_FLAGS)) + +.section .multiboot + .align 4 + .long MB_MAGIC + .long MB_FLAGS + .long MB_CHECKSUM + +.section .bss + .align 16 + stack_bottom: + .skip 4096 + stack_top: + +.section .text + start: + mov $stack_top, %esp + + hang: + cli + hlt + jmp hang