From b812a9899f5ba9930941538ef0fea97b2c138f9a Mon Sep 17 00:00:00 2001 From: Nocturn9x Date: Thu, 17 Nov 2022 21:19:36 +0100 Subject: [PATCH] Major refactoring, added Makefile --- .gitignore | 1 - .vscode/c_cpp_properties.json | 17 ++++ Makefile | 91 +++++++++++++++++++ build-cross-compiler.sh | 19 ---- build.sh | 12 --- build/.gitkeep | 0 env.sh | 6 -- {src => include}/kernel/drivers/ports/ports.h | 0 {src => include}/kernel/drivers/vga/screen.h | 5 +- {src => include}/kernel/ktypes.h | 0 obj/.gitkeep | 0 run.sh | 2 - src/kernel/drivers/ports/ports.c | 2 +- src/kernel/drivers/vga/screen.c | 6 +- 14 files changed, 115 insertions(+), 46 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 Makefile delete mode 100755 build-cross-compiler.sh delete mode 100755 build.sh delete mode 100644 build/.gitkeep delete mode 100755 env.sh rename {src => include}/kernel/drivers/ports/ports.h (100%) rename {src => include}/kernel/drivers/vga/screen.h (86%) rename {src => include}/kernel/ktypes.h (100%) delete mode 100644 obj/.gitkeep delete mode 100755 run.sh diff --git a/.gitignore b/.gitignore index 3c8a180..419a80e 100644 --- a/.gitignore +++ b/.gitignore @@ -58,7 +58,6 @@ CMakeCache.txt CMakeFiles CMakeScripts Testing -Makefile cmake_install.cmake install_manifest.txt compile_commands.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..900f09f --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,17 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/include/" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "gnu17", + "cppStandard": "gnu++17", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f04c4bb --- /dev/null +++ b/Makefile @@ -0,0 +1,91 @@ +# Note: Your cross-compilation toolchain must be in PATH for this +# to work. Change these variables if it isn't (it should be, trust me) + +.SUFFIXES: + +CC := i386-elf-gcc +GDB := i386-elf-gdb +LD := i386-elf-ld +AS := nasm +IDIR := include +SRCDIR := src +BUILDDIR := build +OBJDIR := obj +DISTDIR := dist +CFLAGS := -g -I $(IDIR) -Wall -pedantic -Wno-builtin-declaration-mismatch -ffreestanding +KERNEL_SOURCES := $(shell find src/kernel -name '*.c' -type f) +KERNEL_OBJS := $(KERNEL_SOURCES:.c=.o) +KERNEL_OBJS := $(subst src/,$(OBJDIR)/,$(KERNEL_OBJS)) + +DRIVERS_SOURCES := $(shell find src/kernel/drivers -name '*.c' -type f) +DRIVERS_OBJS := $(DRIVERS_SOURCES:.c=.o) +DRIVERS_OBJS := $(subst src/,$(OBJDIR)/,$(DRIVERS_OBJS)) + + +BOOTLOADER_SOURCES := $(shell find src/boot -name '*.s' -type f) +BOOTLOADER_OBJS := $(BOOTLOADER_SOURCES:.s=.o) +BOOTLOADER_OBJS := $(subst src/,$(OBJDIR)/,$(BOOTLOADER_OBJS)) + + +BUILD_PATHS := $(subst src/,$(OBJDIR),$(dir $(KERNEL_OBJS))) +BUILD_PATHS += $(subst src/,$(OBJDIR),$(dir $(DRIVERS_OBJS))) + + +prepare: + mkdir -p $(BUILD_PATHS) + + +clean: + rm -rf obj/ + rm -rf build/ + rm -rf dist/ + + +# Produce obj/path/to/file.o in the ELF format +# if src/path/to/file.s exists +$(OBJDIR)/%.o: prepare $(SRCDIR)/%.s + $(AS) -f elf $(word 2,$^) -o $@ + + +# Produce build/path/to/file.bin in the binary +# format if src/path/to/file.s exists +$(BUILDDIR)/%.bin: prepare $(SRCDIR)/%.s + $(AS) -f bin $(word 2,$^) -o $@ + + +# Special case for our master boot record +$(BUILDDIR)/mbr.bin: prepare $(SRCDIR)/boot/mbr.s + $(AS) -f bin $(word 2,$^) -o $(BUILDDIR)/mbr.bin + + +# Produce obj/path/to/file.o using gcc if +# src/path/to/file.c exists +$(OBJDIR)/%.o: prepare $(SRCDIR)/%.c + $(CC) $(CFLAGS) -c $(word 2,$^) -o $@ + + +# Compile kernel drivers +drivers: $(DRIVERS_OBJS) + +# Compile and link the kernel +$(BUILDDIR)/kernel.bin: $(OBJDIR)/entrypoint.o $(KERNEL_OBJS) $(DRIVERS_OBJS) + $(LD) -o $@ -Ttext 0x1000 $^ --oformat binary + + +kernel: $(BUILDDIR)/kernel.bin + +# Compile the bootloader +bootloader: $(BUILDDIR)/mbr.bin + + +# Compile and link everything +all: bootloader drivers kernel + + +image: $(BUILDDIR)/mbr.bin $(BUILDDIR)/kernel.bin + mkdir -p $(DISTDIR)/ + cat $^ > $(DISTDIR)/os.img + + +run: image + qemu-system-x86_64 -drive format=raw,file=$(DISTDIR)/os.img,index=0,media=disk \ No newline at end of file diff --git a/build-cross-compiler.sh b/build-cross-compiler.sh deleted file mode 100755 index ba28f1a..0000000 --- a/build-cross-compiler.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/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 deleted file mode 100755 index 4cd64b8..0000000 --- a/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Compile the kernel and its drivers -i386-elf-gcc -ffreestanding -I src/ -c src/kernel/main.c -o obj/kernel.o -i386-elf-gcc -ffreestanding -I src/ -c src/kernel/drivers/vga/screen.c -o obj/screen.o -i386-elf-gcc -ffreestanding -I src/ -c src/kernel/drivers/ports/ports.c -o obj/ports.o -# Compile the assembly entry point and the MBR -nasm -f elf src/entrypoint.s -o obj/entry.o -nasm -f bin src/boot/mbr.s -o build/mbr.bin -# Link everything together -i386-elf-ld -o build/kernel.bin -Ttext 0x1000 entry.o kernel.o ports.o screen.o --oformat binary -# Produce a bootable image -cat build/mbr.bin build/kernel.bin > build/os.img diff --git a/build/.gitkeep b/build/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/env.sh b/env.sh deleted file mode 100755 index 7fe3332..0000000 --- a/env.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -export CC=/usr/bin/gcc -export LD=/usr/bin/gcc -export PREFIX="/usr/local/i386elfgcc" -export TARGET=i386-elf -export PATH=$PATH:$PREFIX/bin diff --git a/src/kernel/drivers/ports/ports.h b/include/kernel/drivers/ports/ports.h similarity index 100% rename from src/kernel/drivers/ports/ports.h rename to include/kernel/drivers/ports/ports.h diff --git a/src/kernel/drivers/vga/screen.h b/include/kernel/drivers/vga/screen.h similarity index 86% rename from src/kernel/drivers/vga/screen.h rename to include/kernel/drivers/vga/screen.h index d38534c..b8f2767 100644 --- a/src/kernel/drivers/vga/screen.h +++ b/include/kernel/drivers/vga/screen.h @@ -4,6 +4,7 @@ #include "kernel/ktypes.h" #include "kernel/drivers/ports/ports.h" + #define VMEM_ADDRESS 0xb8000 #define VMEM_BUF ((byte*)VMEM_ADDRESS) #define MAX_ROWS 25 @@ -21,8 +22,8 @@ // Public API void clearScreen(void); -void kprintAt(byte* message, i32 col, i32 row); -void kprint(byte* message); +void kprintAt(char* message, i32 col, i32 row); +void kprint(char* message); #endif \ No newline at end of file diff --git a/src/kernel/ktypes.h b/include/kernel/ktypes.h similarity index 100% rename from src/kernel/ktypes.h rename to include/kernel/ktypes.h diff --git a/obj/.gitkeep b/obj/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/run.sh b/run.sh deleted file mode 100755 index b507bd6..0000000 --- a/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -qemu-system-x86_64 -drive format=raw,file=build/os.bin,index=0,media=disk diff --git a/src/kernel/drivers/ports/ports.c b/src/kernel/drivers/ports/ports.c index bed4101..ea57735 100644 --- a/src/kernel/drivers/ports/ports.c +++ b/src/kernel/drivers/ports/ports.c @@ -1,6 +1,6 @@ // Utilities for writing to and reading from I/O ports -#include "ports.h" +#include "kernel/drivers/ports/ports.h" // Note: We use the volatile modifier everywhere because diff --git a/src/kernel/drivers/vga/screen.c b/src/kernel/drivers/vga/screen.c index e3dc448..5998821 100644 --- a/src/kernel/drivers/vga/screen.c +++ b/src/kernel/drivers/vga/screen.c @@ -1,5 +1,5 @@ // Implementation of a simple text-only VGA driver -#include "screen.h" +#include "kernel/drivers/vga/screen.h" #include "kernel/ktypes.h" @@ -13,7 +13,7 @@ i32 getColumn(i32 offset); // Public API below -void kprintAt(byte* message, i32 col, i32 row) { +void kprintAt(char* message, i32 col, i32 row) { /* Prints a null-terminated string to the VGA text buffer at the specified row and column. @@ -42,7 +42,7 @@ void kprintAt(byte* message, i32 col, i32 row) { } -void kprint(byte* message) { +void kprint(char* message) { /* Prints a null-terminated string to the VGA text buffer