From 43fdee65b9d639b99cf442ab43796d32eb4ad3e9 Mon Sep 17 00:00:00 2001 From: lohrrrr Date: Mon, 25 May 2026 14:43:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D0=BE=D0=B2=D0=BE=D0=B5=20=D1=8F=D0=B4=D1=80=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/kernel.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ kernel/linker.ld | 24 +++++++++++++++++ kernel/start.s | 26 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 kernel/kernel.c create mode 100644 kernel/linker.ld create mode 100644 kernel/start.s 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