From 7caa808d2a4d0445f97db3fc4e2af1ba8f1cbe9d Mon Sep 17 00:00:00 2001 From: Mika Westphal Date: Thu, 19 Jan 2023 19:35:53 +0100 Subject: [PATCH] Init --- .gdb_history | 27 +++++++++++++++++ Makefile | 38 +++++++++++++++++++++++ build/boot.o | Bin 0 -> 832 bytes build/kernel.elf | Bin 0 -> 13824 bytes build/kernel.o | Bin 0 -> 5628 bytes build/kernel/vga.o | Bin 0 -> 9388 bytes linker.ld | 26 ++++++++++++++++ src/boot.asm | 28 +++++++++++++++++ src/kernel.cpp | 13 ++++++++ src/kernel/vga.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++ src/kernel/vga.h | 46 ++++++++++++++++++++++++++++ 11 files changed, 251 insertions(+) create mode 100644 .gdb_history create mode 100644 Makefile create mode 100644 build/boot.o create mode 100755 build/kernel.elf create mode 100644 build/kernel.o create mode 100644 build/kernel/vga.o create mode 100644 linker.ld create mode 100644 src/boot.asm create mode 100644 src/kernel.cpp create mode 100644 src/kernel/vga.cpp create mode 100644 src/kernel/vga.h diff --git a/.gdb_history b/.gdb_history new file mode 100644 index 0000000..89a021a --- /dev/null +++ b/.gdb_history @@ -0,0 +1,27 @@ +remote localhost:1234 +target remote localhost:1234 +kill +target remote localhost:1234 +symbol-file build/kernel +symbol-file build/kernel.elf +d main +disassemble main +list +p VGA +p *(VGA) +b _ZN3VGA20terminal_writestringEPKc +n +line +list +n +list +c +list +b VGA::linebreak +c +c +c +d VGA::linebreak +disassemble VGA::linebreak +list +list VGA::linebreak diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d3bf705 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +LINKFILE=linker.ld +QEMU=qemu-system-i386 +BUILDPATH=build +SOURCEPATH=src +CC=i686-elf-g++ +CFLAGS=-m32 -c -Wmultichar -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti -Wwrite-strings -fpermissive -g +#OBJ=$(BUILDPATH)/boot.o $(BUILDPATH)/kernel.o $(BUILDPATH)/kernel/vga.o $(BUILDPATH)/kernel/keyboard.o $(BUILDPATH)/kernel/idt.o +OBJ=$(BUILDPATH)/boot.o $(BUILDPATH)/kernel.o $(BUILDPATH)/kernel/vga.o +ASMC=i686-elf-as +LD=ld +LDFLAGS=-m elf_i386 -T $(LINKFILE) -z muldefs -g + +all: $(BUILDPATH)/kernel.elf + $(QEMU) -kernel $(BUILDPATH)/kernel.elf + +debug: $(BUILDPATH)/kernel.elf + $(QEMU) -s -S -kernel $(BUILDPATH)/kernel.elf + +$(BUILDPATH)/boot.o: $(SOURCEPATH)/boot.asm + $(ASMC) $(SOURCEPATH)/boot.asm -o $(BUILDPATH)/boot.o + +$(BUILDPATH)/kernel.o: $(SOURCEPATH)/kernel.* + $(CC) $(CFLAGS) $(SOURCEPATH)/kernel.cpp -o $(BUILDPATH)/kernel.o + +$(BUILDPATH)/kernel/vga.o: $(SOURCEPATH)/kernel/vga.* + $(CC) $(CFLAGS) $(SOURCEPATH)/kernel/vga.cpp -o $(BUILDPATH)/kernel/vga.o + +$(BUILDPATH)/kernel/keyboard.o: $(SOURCEPATH)/kernel/keyboard.* $(BUILDPATH)/boot.o + $(CC) $(CFLAGS) $(SOURCEPATH)/kernel/keyboard.cpp -o $(BUILDPATH)/kernel/keyboard.o + +$(BUILDPATH)/kernel/idt.o: $(SOURCEPATH)/kernel/idt.* $(BUILDPATH)/boot.o + $(CC) $(CFLAGS) $(SOURCEPATH)/kernel/idt.cpp -o $(BUILDPATH)/kernel/idt.o + +$(BUILDPATH)/kernel.elf: $(OBJ) + $(LD) $(LDFLAGS) -o $(BUILDPATH)/kernel.elf $(OBJ) + +clean: + rm $(OBJ) diff --git a/build/boot.o b/build/boot.o new file mode 100644 index 0000000000000000000000000000000000000000..3fd271c93359e77384ee1a95dd1b04822f3573dd GIT binary patch literal 832 zcmaJ<%SyvQ6uoI{wcs0Eb>T)q5JClaZu+3D#XiL1PAG{6ENvP|M$nbN;ZF#DfFIL^ z3&B;ul@G>yl9?t2@xsix=gyro_s+~iz1=VjgR~ixrGybZs)fS{_ozU5dZ9AW+qabR z^W*(T?~F0?{8Y@c`_(&pB{R5pg=I4eKgMhA`OerB&Yd9h$`Tftb`X&1-j2o4_B=7K z`5)WnMbw*DNvLyG`2gKZk^Mp{Ug9FxnJ=oG9ODv?UB%G@tQx~?)_VIKLB7sAMMfD@ zY|w_4c<4Rg$XkY^4Clf&cxWx~3m!*slxYoMMhAgRrVOYBy3oVf=ryf3<-9J(v}rxf z|HAp70KK##crNNK(F!H*GpR3>Ys`~fq1?hc|B?8-P{N7+N)!lX9FONLEznLnz~>!+ zmvt~VyCb~$CRbC{ON`MQRNAd(mpb)MtJ~;Nqg`qCsZ(jTYE(O}*G~H99SVeXIU3lW j5T2`u@NQ_pabM8L@h8rB;9A28Yob?!8^V9ftPuSIY_U;u literal 0 HcmV?d00001 diff --git a/build/kernel.elf b/build/kernel.elf new file mode 100755 index 0000000000000000000000000000000000000000..dc420cd4ba82a452b47adc625b17e637e95b85b1 GIT binary patch literal 13824 zcmeHOdvF`oxj$!j&q|hLTe9ppCJB)p=bgy0lN;j133eRCb{@8I;yj?Po{~e_mBIR7xwJ;{=V~_@7uGxR&EY#TF*IW=Akf^5$0lUwhY%DOAXF4=3@$*$2_1* zX*bbnfSk(YDN>}gH8=Ql(oxNrPS+Gl;N&rxfyoR^W?(V{lNp%Iz+?s{GccKf$qY

PG)n({_zi_I1Eg`Zwfwo^ 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 G^7{`Av}Mx( literal 0 HcmV?d00001 diff --git a/build/kernel/vga.o b/build/kernel/vga.o new file mode 100644 index 0000000000000000000000000000000000000000..35f3947470583726706a0014820ad75d54f94af3 GIT binary patch literal 9388 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 YN&aog|4#Dsdqe)S3E{s~@{1+^KZ*$fLI3~& literal 0 HcmV?d00001 diff --git a/linker.ld b/linker.ld new file mode 100644 index 0000000..53f4129 --- /dev/null +++ b/linker.ld @@ -0,0 +1,26 @@ +ENTRY(_start) +SECTIONS +{ + . = 1M; + .text BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + *(.text) + } +  + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } +  + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } +  + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } +} diff --git a/src/boot.asm b/src/boot.asm new file mode 100644 index 0000000..90916ed --- /dev/null +++ b/src/boot.asm @@ -0,0 +1,28 @@ +.set ALIGN, 1<<0 +.set MEMINFO, 1<<1 +.set FLAGS, ALIGN | MEMINFO +.set MAGIC, 0x1BADB002 +.set CHECKSUM, -(MAGIC + FLAGS) + +.section .multiboot +.align 4 +.long MAGIC +.long FLAGS +.long CHECKSUM + +.section .bss +.align 16 +stack_bottom: +.skip 16384 +stack_top: + +.section .text +.global _start +.type _start, @function +_start: + mov $stack_top, %esp + call kernel_main + cli +1: hlt + jmp 1b +.size _start, . - _start diff --git a/src/kernel.cpp b/src/kernel.cpp new file mode 100644 index 0000000..a6a7bb7 --- /dev/null +++ b/src/kernel.cpp @@ -0,0 +1,13 @@ +#include "kernel/vga.h" + +void main() { + VGA vga = VGA(); + vga.terminal_init(); + vga.terminal_writestring("Hello from kernel main\nTest\n"); + for(int i = 0; i < 80; i++) + vga.terminal_writestring("YEET\n"); +} + +extern "C" void kernel_main(void) { + main(); +} diff --git a/src/kernel/vga.cpp b/src/kernel/vga.cpp new file mode 100644 index 0000000..06a478a --- /dev/null +++ b/src/kernel/vga.cpp @@ -0,0 +1,73 @@ +#include "vga.h" + +inline uint8_t VGA::vga_entry_color(enum vga_color fg, enum vga_color bg) { + return fg | bg << 4; +} + +inline uint16_t VGA::vga_entry(unsigned char uc, uint8_t color) { + return (uint16_t) uc | (uint16_t) color << 8; +} + +size_t VGA::strlen(const char* str) { + size_t len = 0; + while (str[len]) + len++; + return len; +} + +void VGA::linebreak() { + if(terminal_row == VGA_HEIGHT) { + for(size_t row = 1; row < VGA_HEIGHT; row++) { + terminal_buffer[row - 1] = terminal_buffer[row]; + } + }else { + terminal_row++; + } + + terminal_column = 0; +} + +void VGA::terminal_setcolor(uint8_t color) { + terminal_color = color; +} + +void VGA::terminal_putentryat(char c, uint8_t color, size_t x, size_t y) { + const size_t index = y * VGA_WIDTH + x; + terminal_buffer[index] = vga_entry(c, color); +} + +void VGA::terminal_putchar(char c) { + terminal_putentryat(c, terminal_color, terminal_column, terminal_row); + if(++terminal_column == VGA_WIDTH) { + terminal_column = 0; + if(++terminal_row == VGA_HEIGHT) + terminal_row = 0; + } +} + +void VGA::terminal_write(const char* data, size_t size) { + for(size_t i = 0; i < size; i++) { + if(data[i] == '\n') { + linebreak(); + continue; + } + terminal_putchar(data[i]); + } +} + +void VGA::terminal_writestring(const char* data) { + terminal_write(data, strlen(data)); +} + +void VGA::terminal_init(void) { + terminal_row = 0; + terminal_column = 0; + terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); + terminal_buffer = (uint16_t*) 0xB8000; + for (size_t y = 0; y < VGA_HEIGHT; y++) { + for(size_t x = 0; x < VGA_WIDTH; x++) { + const size_t index = y * VGA_WIDTH + x; + terminal_buffer[index] = vga_entry(' ', terminal_color); + } + } +} diff --git a/src/kernel/vga.h b/src/kernel/vga.h new file mode 100644 index 0000000..8727863 --- /dev/null +++ b/src/kernel/vga.h @@ -0,0 +1,46 @@ +#include +#include +#include + +class VGA { +protected: + static const size_t VGA_WIDTH = 80; + static const size_t VGA_HEIGHT = 80; + + size_t terminal_row; + size_t terminal_column; + uint8_t terminal_color; + uint16_t* terminal_buffer; + + void terminal_putentryat(char c, uint8_t color, size_t x, size_t y); + void terminal_putchar(char c); + void linebreak(); + +public: + enum vga_color { + VGA_COLOR_BLACK = 0, + VGA_COLOR_BLUE = 1, + VGA_COLOR_GREEN = 2, + VGA_COLOR_CYAN = 3, + VGA_COLOR_RED = 4, + VGA_COLOR_MAGENTA = 5, + VGA_COLOR_BROWN = 6, + VGA_COLOR_LIGHT_GREY = 7, + VGA_COLOR_DARK_GREY = 8, + VGA_COLOR_LIGHT_BLUE = 9, + VGA_COLOR_LIGHT_GREEN = 10, + VGA_COLOR_LIGHT_CYAN = 11, + VGA_COLOR_LIGHT_RED = 12, + VGA_COLOR_LIGHT_MAGENTA = 13, + VGA_COLOR_LIGHT_BROWN = 14, + VGA_COLOR_WHITE = 15, + }; + + static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg); + static inline uint16_t vga_entry(unsigned char uc, uint8_t color); + size_t strlen(const char* str); + void terminal_setcolor(uint8_t color); + void terminal_write(const char* data, size_t size); + void terminal_writestring(const char* data); + void terminal_init(void); +};