diff --git a/nob.c b/nob.c index c5b422e..5beb98a 100644 --- a/nob.c +++ b/nob.c @@ -12,8 +12,11 @@ int main(int argc, char **argv) { Nob_Cmd cmd = {0}; - nob_cmd_append(&cmd, "cc", "-Wall", "-Wextra", "-o", BUILD_FOLDER "kernel", SRC_FOLDER "kernel.c"); + nob_cmd_append(&cmd, "i686-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s"); + if (!nob_cmd_run(&cmd)) + return 1; + nob_cmd_append(&cmd, "i686-elf-gcc", "-Wall", "-Wextra", "-o", BUILD_FOLDER "kernel", SRC_FOLDER "kernel.c"); if (!nob_cmd_run(&cmd)) return 1; diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..735a67f --- /dev/null +++ b/shell.nix @@ -0,0 +1,10 @@ +{ pkgs ? import {} }: + +pkgs.mkShell { + nativeBuildInputs = + with pkgs; [ + pkgsCross.i686-embedded.buildPackages.gcc + pkgsCross.i686-embedded.buildPackages.binutils + gdb + ]; +} diff --git a/src/boot.s b/src/boot.s new file mode 100644 index 0000000..3ee4cf0 --- /dev/null +++ b/src/boot.s @@ -0,0 +1,34 @@ +/* Multiboot header */ + .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 /* 16 KiB */ +stack_top: + + .section .text + .global _start + .type _start, @function +_start: + mov $stack_top, %esp + + /* Initialize processor state here */ + + call kernel_main + + cli /* Disable interrupts */ +1: hlt /* Waits for an interrupt */ + jmp 1b /* Jump in case an interrupt actually arrives */ + + .size _start, . - _start diff --git a/src/linker.ld b/src/linker.ld new file mode 100644 index 0000000..e69de29