From 2932e2946e8924c8974a4f9adb5937fef0d90056 Mon Sep 17 00:00:00 2001 From: Mattia Giambirtone Date: Wed, 16 Nov 2022 20:24:23 +0100 Subject: [PATCH] Cleanup and refactoring --- .vscode/settings.json | 5 +++++ build-cross-compiler.sh | 19 ++++++++++++++++++ build.sh | 7 ++++--- env.sh | 2 +- src/{bootloader => boot}/gdt.s | 0 src/{bootloader => boot}/mbr.s | 8 ++++---- src/{bootloader => boot}/switch32.s | 0 src/{bootloader => boot}/util/disk.s | 0 src/{bootloader => boot}/util/io.s | 0 src/kernel/drivers/vga/video.c | 30 ++++++++++++++++++++++++++++ src/kernel/drivers/vga/video.h | 14 +++++++++++++ src/kernel/main.c | 13 +++++------- src/kernel/types/ktypes.h | 15 ++++++++++++++ 13 files changed, 97 insertions(+), 16 deletions(-) create mode 100644 .vscode/settings.json create mode 100755 build-cross-compiler.sh rename src/{bootloader => boot}/gdt.s (100%) rename src/{bootloader => boot}/mbr.s (93%) rename src/{bootloader => boot}/switch32.s (100%) rename src/{bootloader => boot}/util/disk.s (100%) rename src/{bootloader => boot}/util/io.s (100%) create mode 100644 src/kernel/drivers/vga/video.c create mode 100644 src/kernel/drivers/vga/video.h create mode 100644 src/kernel/types/ktypes.h diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6f2e1e8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "ktypes.h": "c" + } +} \ No newline at end of file diff --git a/build-cross-compiler.sh b/build-cross-compiler.sh new file mode 100755 index 0000000..ba28f1a --- /dev/null +++ b/build-cross-compiler.sh @@ -0,0 +1,19 @@ +#!/bin/bash +mkdir /tmp/src +cd /tmp/src +curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.gz +tar xf binutils-2.39.tar.gz +mkdir binutils-build +cd binutils-build +../binutils-2.39/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log +sudo make all install 2>&1 | tee make.log +cd /tmp/src +curl -O https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz +tar xf gcc-12.2.0.tar.gz +mkdir gcc-build +cd gcc-build +../gcc-12.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers +sudo make all-gcc +sudo make all-target-libgcc +sudo make install-gcc +sudo make install-target-libgcc diff --git a/build.sh b/build.sh index 127e7fe..4f68749 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,6 @@ #!/bin/bash -i386-elf-gcc -ffreestanding -c src/kernel/main.c -o main.o -nasm -f elf src/entrypoint.s -o entrypoint.o -i386-elf-ld -o kernel.bin -Ttext 0x1000 entrypoint.o main.o --oformat binary +i386-elf-gcc -ffreestanding -c src/kernel/main.c -o kernel.o +nasm -f elf src/entrypoint.s -o entry.o +nasm -f bin src/boot/mbr.s -o mbr.bin +i386-elf-ld -o kernel.bin -Ttext 0x1000 entry.o kernel.o --oformat binary cat mbr.bin kernel.bin > os.bin diff --git a/env.sh b/env.sh index 54a708f..7fe3332 100755 --- a/env.sh +++ b/env.sh @@ -3,4 +3,4 @@ export CC=/usr/bin/gcc export LD=/usr/bin/gcc export PREFIX="/usr/local/i386elfgcc" export TARGET=i386-elf -export PATH="$PREFIX/bin:$PATH" +export PATH=$PATH:$PREFIX/bin diff --git a/src/bootloader/gdt.s b/src/boot/gdt.s similarity index 100% rename from src/bootloader/gdt.s rename to src/boot/gdt.s diff --git a/src/bootloader/mbr.s b/src/boot/mbr.s similarity index 93% rename from src/bootloader/mbr.s rename to src/boot/mbr.s index ec5848b..ae51b9d 100644 --- a/src/bootloader/mbr.s +++ b/src/boot/mbr.s @@ -25,10 +25,10 @@ jmp $ ; Keeps jumping at the current address (loops forever) ; Now we include our "function definitions" (after the ; loop, so they're never executed unless explicitly called) -%include "src/bootloader/util/disk.s" -%include "src/bootloader/util/io.s" -%include "src/bootloader/gdt.s" -%include "src/bootloader/switch32.s" +%include "src/boot/util/disk.s" +%include "src/boot/util/io.s" +%include "src/boot/gdt.s" +%include "src/boot/switch32.s" [bits 16] ; All x86 CPUs start in 16 bit (aka "real") mode, so we tell nasm to emit 16-bit code load_kernel: ; Loads the kernel into memory diff --git a/src/bootloader/switch32.s b/src/boot/switch32.s similarity index 100% rename from src/bootloader/switch32.s rename to src/boot/switch32.s diff --git a/src/bootloader/util/disk.s b/src/boot/util/disk.s similarity index 100% rename from src/bootloader/util/disk.s rename to src/boot/util/disk.s diff --git a/src/bootloader/util/io.s b/src/boot/util/io.s similarity index 100% rename from src/bootloader/util/io.s rename to src/boot/util/io.s diff --git a/src/kernel/drivers/vga/video.c b/src/kernel/drivers/vga/video.c new file mode 100644 index 0000000..b68d641 --- /dev/null +++ b/src/kernel/drivers/vga/video.c @@ -0,0 +1,30 @@ +// Implementation of a simple video driver using VGA text mode +#include "video.h" + + +uchar_t vga_readb(u16_t port) { + // Reads a byte from the specified I/O port + uchar_t result; + __asm__("in %%dx, %%al" : "=a" (result) : "d" (port)); + return result; +} + + +void vga_writeb(u16_t port, uchar_t data) { + // Writes a byte from the specified I/O port + __asm__("out %%al, %%dx" : : "a" (data), "d" (port)); +} + + +u16_t vga_writew(u16_t port) { + // Reads a word (16 bits) from the specified I/O port + u16_t result; + __asm__("in %%dx, %%ax" : "=a" (result) : "d" (port)); + return result; +} + + +void vga_readw(u16_t port, u16_t data) { + // Writes a word (16 bits) to the specified I/O port + __asm__("out %%ax, %%dx" : : "a" (data), "d" (port)); +} \ No newline at end of file diff --git a/src/kernel/drivers/vga/video.h b/src/kernel/drivers/vga/video.h new file mode 100644 index 0000000..637c706 --- /dev/null +++ b/src/kernel/drivers/vga/video.h @@ -0,0 +1,14 @@ +#ifndef TSOS_DRV_VGA_H // Avoid nasty double-inclusion problems +#define TSOS_DRV_VGA_H +#define VMEM_ADDR 0xb8000 +#include "kernel/types/ktypes.h" + + +uchar_t vga_writeb(u16_t port); +void vga_readb(u16_t port, uchar_t data); +u16_t vga_writew(u16_t port); +void vga_readw(u16_t port, u16_t data); + + + +#endif \ No newline at end of file diff --git a/src/kernel/main.c b/src/kernel/main.c index 76e3163..79fc590 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -1,15 +1,12 @@ -// C entry point of our kernel -#define VMEM_ADDR 0xb8000 - -void dummy_test_entrypoint(void) { -} +// Entry point of the TSOS kernel +#include "types/ktypes.h" void kmain(void) { - char* vbuf = (char*)VMEM_ADDR; + char_t* vbuf = (char_t*)0xb8000; vbuf += 480; // We skip the log messages before us - char *s = "Hello from the TSOS kernel!"; - for (int i = 0; s[i] != '\0'; i++) { + char_t *s = "Hello from the TSOS kernel!"; + for (int_t i = 0; s[i] != '\0'; i++) { *vbuf = s[i]; vbuf += 2; } diff --git a/src/kernel/types/ktypes.h b/src/kernel/types/ktypes.h new file mode 100644 index 0000000..462a8d0 --- /dev/null +++ b/src/kernel/types/ktypes.h @@ -0,0 +1,15 @@ +// Shorthand definitions of various types +// used in the kernel +#ifndef TSOS_KTYPES +#define TSOS_KTYPES + + +typedef unsigned char uchar_t; +typedef unsigned short int u16_t; +typedef short int i16_t; +typedef char char_t; +typedef unsigned int uint_t; +typedef int int_t; + + +#endif \ No newline at end of file