Сделал базовое ядро

This commit is contained in:
lohrrrr 2026-05-25 14:43:58 +03:00
parent f9c16f1bf1
commit 43fdee65b9
3 changed files with 117 additions and 0 deletions

67
kernel/kernel.c Normal file
View file

@ -0,0 +1,67 @@
// fether os kernel.
#include <stddef.h>
#include <stdint.h>
// 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.");
}

24
kernel/linker.ld Normal file
View file

@ -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)
}
}

26
kernel/start.s Normal file
View file

@ -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