From 01f16ce21094e9e842375d9f404410aed530284d Mon Sep 17 00:00:00 2001 From: nub31 Date: Sun, 24 Aug 2025 21:00:04 +0200 Subject: [PATCH] ... --- makefile | 32 ++++++++++------------ src/idt.c | 5 ++-- src/kernel.c | 10 +++++-- src/string.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/string.h | 8 +++++- src/vga.c | 66 ++++++++------------------------------------ src/vga.h | 8 +++--- 7 files changed, 123 insertions(+), 83 deletions(-) diff --git a/makefile b/makefile index 2036e82..67d847b 100644 --- a/makefile +++ b/makefile @@ -1,9 +1,16 @@ CC = x86_64-elf-gcc LD = x86_64-elf-ld -CFLAGS = -m64 -ffreestanding -fno-builtin -Wall -Wextra -Wshadow -std=c23 +CFLAGS = -m64 -ffreestanding -fno-builtin -Wall -Wextra -Wshadow -std=c23 LDFLAGS = +SRC_C := src/kernel.c src/vga.c src/idt.c src/string.c +SRC_ASM := src/boot.asm src/idt_stub.asm + +OBJ_C := $(SRC_C:src/%.c=.build/%.o) +OBJ_ASM := $(SRC_ASM:src/%.asm=.build/%.o) +OBJS := $(OBJ_C) $(OBJ_ASM) + all: .build/nub-os.iso clean: @@ -12,26 +19,17 @@ clean: build-dir: mkdir .build 2>/dev/null || true -.build/nub-os.iso: build-dir .build/kernel +.build/nub-os.iso: .build/kernel mkdir -p .build/iso/boot/grub cp grub.cfg .build/iso/boot/grub cp .build/kernel .build/iso/boot/ grub-mkrescue -o .build/nub-os.iso .build/iso/ -.build/kernel: build-dir .build/boot.o .build/kernel.o .build/vga.o .build/idt.o .build/idt_stub.o - $(LD) $(LDFLAGS) -T src/boot.ld -o .build/kernel .build/boot.o .build/kernel.o .build/vga.o .build/idt.o .build/idt_stub.o +.build/kernel: $(OBJS) + $(LD) $(LDFLAGS) -T src/boot.ld -o $@ $^ -.build/kernel.o: build-dir src/kernel.c - $(CC) $(CFLAGS) -c -o .build/kernel.o src/kernel.c +.build/%.o: src/%.c | build-dir + $(CC) $(CFLAGS) -c -o $@ $< -.build/vga.o: build-dir src/vga.c - $(CC) $(CFLAGS) -c -o .build/vga.o src/vga.c - -.build/idt.o: build-dir src/idt.c - $(CC) $(CFLAGS) -c -o .build/idt.o src/idt.c - -.build/idt_stub.o: build-dir src/idt_stub.asm - nasm -f elf64 -o .build/idt_stub.o src/idt_stub.asm - -.build/boot.o: build-dir src/boot.asm - nasm -f elf64 -o .build/boot.o src/boot.asm \ No newline at end of file +.build/%.o: src/%.asm | build-dir + nasm -f elf64 -o $@ $< \ No newline at end of file diff --git a/src/idt.c b/src/idt.c index 7d10847..d90c3b7 100644 --- a/src/idt.c +++ b/src/idt.c @@ -52,10 +52,10 @@ void idt_set_descriptor(uint8_t vector, void* handler, uint8_t dpl) void exception_handler(isr_frame_t* frame) { vga_print("Interrupt\n"); - vga_print(" int_no:"); + vga_print(" int_no: "); vga_print_uint(frame->int_no); vga_print("\n"); - vga_print(" err_code:"); + vga_print(" err_code: "); vga_print_uint(frame->err_code); vga_print("\n"); __asm__ volatile("cli; hlt"); @@ -71,5 +71,4 @@ void idt_init(void) idtr_t idtr = { .base = (uintptr_t)&idt[0], .limit = (uint16_t)sizeof(interrupt_descriptor) * IDT_SIZE - 1 }; __asm__ volatile("lidt %0" : : "m"(idtr)); - __asm__ volatile("sti"); } \ No newline at end of file diff --git a/src/kernel.c b/src/kernel.c index bdbe527..4283b86 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -4,11 +4,15 @@ void kernel_main(void) { vga_clear(); + vga_print_success(); + vga_print(" VGA intialzied\n"); idt_init(); - vga_print_success("IDT intialzied\n"); + vga_print_success(); + vga_print(" IDT intialzied\n"); - vga_print("Welcome to nub OS\n"); + vga_print("\nWelcome to nub OS\n"); + vga_print(">"); - int i = 2 / 0; + int x = 1 / 0; } \ No newline at end of file diff --git a/src/string.c b/src/string.c index b5e6a01..16b3349 100644 --- a/src/string.c +++ b/src/string.c @@ -1,4 +1,5 @@ #include "string.h" +#include int strcmp(const char* a, const char* b) { @@ -10,3 +11,79 @@ int strcmp(const char* a, const char* b) return (*a == *b) ? 0 : (*a > *b) ? 1 : -1; } + +void reverse(char* str, size_t length) +{ + int start = 0; + int end = length - 1; + while (start < end) + { + char temp = str[start]; + str[start] = str[end]; + str[end] = temp; + start++; + end--; + } +} + +int uitoa(uint64_t value, char* buffer) +{ + int i = 0; + if (value == 0) + { + buffer[i++] = '0'; + buffer[i] = '\0'; + return i; + } + + while (value > 0) + { + buffer[i++] = (value % 10) + '0'; + value /= 10; + } + + buffer[i] = '\0'; + reverse(buffer, i); + return i; +} + +int itoa(int64_t value, char* buffer) +{ + int i = 0; + + if (value == 0) + { + buffer[i++] = '0'; + buffer[i] = '\0'; + return i; + } + + bool negative = false; + uint64_t v; + + if (value < 0) + { + negative = true; + v = (uint64_t)(-value); + } + else + { + v = (uint64_t)value; + } + + while (v > 0) + { + buffer[i++] = (v % 10) + '0'; + v /= 10; + } + + if (negative) + { + buffer[i++] = '-'; + } + + buffer[i] = '\0'; + reverse(buffer, i); + + return i; +} \ No newline at end of file diff --git a/src/string.h b/src/string.h index f326318..91ec791 100644 --- a/src/string.h +++ b/src/string.h @@ -1,3 +1,9 @@ #pragma once -int strcmp(const char* a, const char* b); \ No newline at end of file +#include +#include + +int strcmp(const char* a, const char* b); +void reverse(char* str, size_t length); +int uitoa(uint64_t value, char* buffer); +int itoa(int64_t value, char* buffer); \ No newline at end of file diff --git a/src/vga.c b/src/vga.c index c2869ce..201c44d 100644 --- a/src/vga.c +++ b/src/vga.c @@ -1,4 +1,8 @@ #include "vga.h" +#include "string.h" +#include +#include +#include #define ROWS 25 #define COLUMNS 80 @@ -110,78 +114,30 @@ void vga_print(const char* string) vga_print_colored(string, vga_default_color()); } -void vga_print_success(const char* message) +void vga_print_success(void) { vga_print("[ "); vga_print_colored("success", VGA_GREEN); - vga_print(" ] "); - vga_print(message); + vga_print(" ]"); } -void vga_print_error(const char* message) +void vga_print_error(void) { vga_print("[ "); vga_print_colored("error", VGA_RED); - vga_print(" ] "); - vga_print(message); + vga_print(" ]"); } -static void reverse(char* str, int length) -{ - int start = 0; - int end = length - 1; - while (start < end) - { - char temp = str[start]; - str[start] = str[end]; - str[end] = temp; - start++; - end--; - } -} - -static int uitoa(unsigned int value, char* buffer) -{ - int i = 0; - if (value == 0) - { - buffer[i++] = '0'; - buffer[i] = '\0'; - return i; - } - - while (value > 0) - { - buffer[i++] = (value % 10) + '0'; - value /= 10; - } - - buffer[i] = '\0'; - reverse(buffer, i); - return i; -} - -void vga_print_uint(unsigned int value) +void vga_print_uint(uint64_t value) { char buffer[11]; uitoa(value, buffer); vga_print(buffer); } -void vga_print_int(int value) +void vga_print_int(int64_t value) { char buffer[12]; - - if (value < 0) - { - vga_print("-"); - unsigned int abs_val = (unsigned int)(-value); - uitoa(abs_val, buffer); - } - else - { - uitoa((unsigned int)value, buffer); - } - + itoa(value, buffer); vga_print(buffer); } \ No newline at end of file diff --git a/src/vga.h b/src/vga.h index a0fde85..b3b17c1 100644 --- a/src/vga.h +++ b/src/vga.h @@ -27,11 +27,11 @@ void vga_set_cursor_position(uint8_t row, uint8_t col); void vga_print_colored(const char* string, vga_color_t color); void vga_print(const char* string); -void vga_print_success(const char* message); -void vga_print_error(const char* message); +void vga_print_success(void); +void vga_print_error(void); -void vga_print_uint(unsigned int value); -void vga_print_int(int value); +void vga_print_uint(uint64_t value); +void vga_print_int(int64_t value); static inline vga_color_t vga_color(vga_color_t fg_color, vga_color_t bg_color) {