From 10b8fdc33f1d452e066ea90f6b411a17c1744d08 Mon Sep 17 00:00:00 2001 From: Gregory Bowne Date: Tue, 13 May 2025 10:44:10 -0700 Subject: [PATCH] adding and fixing some missing things and some undefined --- bootloader/boot.bin | Bin 0 -> 512 bytes kernel/debug.c | 0 kernel/debug.h | 0 kernel/fs.c | 0 kernel/fs.h | 0 kernel/gdt.asm | 0 kernel/gdt.c | 0 kernel/gdt.h | 0 kernel/heap.c | 0 kernel/heap.h | 0 kernel/idt.c | 66 ++++++++++++++++++++++++++++++++++++++++-- kernel/irq.c | 0 kernel/irq.h | 0 kernel/isr.asm | 68 +++++++++++++++++++++++++++++++++++++------- kernel/isr.h | 0 kernel/keyboard.c | 53 ++++++++++++++++++++++++++++++++++ kernel/keyboard.h | 7 +++++ kernel/kmalloc.c | 0 kernel/kmalloc.h | 0 kernel/multiboot.h | 0 kernel/paging.c | 6 ++-- kernel/serial.c | 37 ++++++++++++++++++------ kernel/serial.h | 6 ++-- kernel/syscalls.c | 0 kernel/syscalls.h | 0 kernel/terminal.c | 52 +++++++++++++++++++++++++++++++-- kernel/terminal.h | 1 + kernel/threading.c | 0 kernel/threading.h | 0 kernel/timer.c | 0 kernel/timer.h | 0 kernel/vga.c | 0 kernel/vga.h | 0 33 files changed, 267 insertions(+), 29 deletions(-) create mode 100644 bootloader/boot.bin create mode 100644 kernel/debug.c create mode 100644 kernel/debug.h create mode 100644 kernel/fs.c create mode 100644 kernel/fs.h create mode 100644 kernel/gdt.asm create mode 100644 kernel/gdt.c create mode 100644 kernel/gdt.h create mode 100644 kernel/heap.c create mode 100644 kernel/heap.h create mode 100644 kernel/irq.c create mode 100644 kernel/irq.h create mode 100644 kernel/isr.h create mode 100644 kernel/keyboard.c create mode 100644 kernel/keyboard.h create mode 100644 kernel/kmalloc.c create mode 100644 kernel/kmalloc.h create mode 100644 kernel/multiboot.h create mode 100644 kernel/syscalls.c create mode 100644 kernel/syscalls.h create mode 100644 kernel/threading.c create mode 100644 kernel/threading.h create mode 100644 kernel/timer.c create mode 100644 kernel/timer.h create mode 100644 kernel/vga.c create mode 100644 kernel/vga.h diff --git a/bootloader/boot.bin b/bootloader/boot.bin new file mode 100644 index 0000000000000000000000000000000000000000..ed8cf0545ddf94c3ed31bb66464860b9e8daef2b GIT binary patch literal 512 zcmexmc%bh_-+{ghdl+h7ura*QV0fX;@MIDX)3Zs38KB_*e;{Mlc?K{&={$ohgG>zr z13#mfNzLJ3{0axsnoltDD;;> 12; // Page table frame address + dir[0].frame = (uint32_t)page_table >> 12; } } diff --git a/kernel/serial.c b/kernel/serial.c index 9d1cef6..f1036c8 100644 --- a/kernel/serial.c +++ b/kernel/serial.c @@ -1,20 +1,39 @@ #include "io.h" +#include "serial.h" #define COM1 0x3F8 +#define COM2 0x2F8 +#define COM3 0x3E8 +#define COM4 0x2E8 + +void serial_init_port(uint16_t port) { + outb(port + 1, 0x00); + outb(port + 3, 0x80); + outb(port + 0, 0x03); + outb(port + 1, 0x00); + outb(port + 3, 0x03); + outb(port + 2, 0xC7); + outb(port + 4, 0x0B); +} void serial_init(void) { - outb(COM1 + 1, 0x00); // Disable interrupts - outb(COM1 + 3, 0x80); // Enable DLAB - outb(COM1 + 0, 0x03); // Set baud rate to 38400 - outb(COM1 + 1, 0x00); - outb(COM1 + 3, 0x03); // 8 bits, no parity, one stop bit - outb(COM1 + 2, 0xC7); // Enable FIFO, clear, 14-byte threshold - outb(COM1 + 4, 0x0B); // IRQs enabled, RTS/DSR set + serial_init_port(COM1); + serial_init_port(COM2); + serial_init_port(COM3); + serial_init_port(COM4); +} + +void serial_write_char(char c) { + while (!(inb(COM1 + 5) & 0x20)); + outb(COM1, c); } void serial_write(const char *str) { while (*str) { - while (!(inb(COM1 + 5) & 0x20)); // Wait for the transmitter holding register to be empty - outb(COM1, *str++); + serial_write_char(*str++); } } + +void serial_write_string(const char* str) { + serial_write(str); +} diff --git a/kernel/serial.h b/kernel/serial.h index 7c0fa3b..7ba444f 100644 --- a/kernel/serial.h +++ b/kernel/serial.h @@ -4,7 +4,9 @@ #include void serial_init(void); -void serial_write(char c); +void serial_init_port(uint16_t port); +void serial_write_char(char c); +void serial_write(const char *str); void serial_write_string(const char *str); -#endif +#endif \ No newline at end of file diff --git a/kernel/syscalls.c b/kernel/syscalls.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/syscalls.h b/kernel/syscalls.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/terminal.c b/kernel/terminal.c index 0978c26..40d0265 100644 --- a/kernel/terminal.c +++ b/kernel/terminal.c @@ -1,5 +1,6 @@ #include #include "io.h" +#include "terminal.h" #define VGA_ADDRESS 0xB8000 #define VGA_WIDTH 80 @@ -9,6 +10,7 @@ static uint16_t* const vga_buffer = (uint16_t*) VGA_ADDRESS; static uint8_t cursor_x = 0; static uint8_t cursor_y = 0; +static uint8_t current_color = WHITE_ON_BLACK; static uint16_t vga_entry(char c, uint8_t color) { return (uint16_t) color << 8 | (uint8_t) c; @@ -18,20 +20,35 @@ void terminal_initialize(void) { for (uint16_t y = 0; y < VGA_HEIGHT; y++) { for (uint16_t x = 0; x < VGA_WIDTH; x++) { const size_t index = y * VGA_WIDTH + x; - vga_buffer[index] = vga_entry(' ', WHITE_ON_BLACK); + vga_buffer[index] = vga_entry(' ', current_color); } } cursor_x = 0; cursor_y = 0; + update_cursor(); // Optional: good idea to reset position } void terminal_putchar(char c) { + // Handle backspace + if (c == '\b') { + if (cursor_x > 0) { + cursor_x--; + } else if (cursor_y > 0) { + cursor_y--; + cursor_x = VGA_WIDTH - 1; + } + vga_buffer[cursor_y * VGA_WIDTH + cursor_x] = vga_entry(' ', current_color); + update_cursor(); // Optional, if you add cursor updating + return; + } + + // Handle newline if (c == '\n') { cursor_x = 0; cursor_y++; } else { const size_t index = cursor_y * VGA_WIDTH + cursor_x; - vga_buffer[index] = vga_entry(c, WHITE_ON_BLACK); + vga_buffer[index] = vga_entry(c, current_color); cursor_x++; if (cursor_x >= VGA_WIDTH) { cursor_x = 0; @@ -49,15 +66,44 @@ void terminal_putchar(char c) { // Clear the last line for (uint16_t x = 0; x < VGA_WIDTH; x++) { - vga_buffer[(VGA_HEIGHT - 1) * VGA_WIDTH + x] = vga_entry(' ', WHITE_ON_BLACK); + vga_buffer[(VGA_HEIGHT - 1) * VGA_WIDTH + x] = vga_entry(' ', current_color); } cursor_y = VGA_HEIGHT - 1; } + + update_cursor(); // Optional, if you want the hardware cursor to follow } + void terminal_write(const char* str) { for (size_t i = 0; str[i] != '\0'; i++) { terminal_putchar(str[i]); } } + +void terminal_setcolor(uint8_t color) +{ + current_color = color; +} + +void terminal_clear(void) { + for (uint16_t y = 0; y < VGA_HEIGHT; y++) { + for (uint16_t x = 0; x < VGA_WIDTH; x++) { + const size_t index = y * VGA_WIDTH + x; + vga_buffer[index] = vga_entry(' ', current_color); + } + } + cursor_x = 0; + cursor_y = 0; + update_cursor(); +} + +static void update_cursor() { + uint16_t pos = cursor_y * VGA_WIDTH + cursor_x; + + outb(0x3D4, 0x0F); + outb(0x3D5, (uint8_t)(pos & 0xFF)); + outb(0x3D4, 0x0E); + outb(0x3D5, (uint8_t)((pos >> 8) & 0xFF)); +} diff --git a/kernel/terminal.h b/kernel/terminal.h index 28dd3c4..ce28bc3 100644 --- a/kernel/terminal.h +++ b/kernel/terminal.h @@ -7,5 +7,6 @@ void terminal_initialize(void); void terminal_putchar(char c); void terminal_write(const char *str); void terminal_setcolor(uint8_t color); +void terminal_clear(void); #endif diff --git a/kernel/threading.c b/kernel/threading.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/threading.h b/kernel/threading.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/timer.c b/kernel/timer.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/timer.h b/kernel/timer.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/vga.c b/kernel/vga.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/vga.h b/kernel/vga.h new file mode 100644 index 0000000..e69de29