From e88de0162cff8bbad80972c1b92355b9d2db0213 Mon Sep 17 00:00:00 2001 From: James Barnett Date: Tue, 28 Aug 2018 14:58:53 +0100 Subject: Add bootable kernel with basic print function --- .gitignore | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ build.sh | 6 ++++++ kernel-bootstrap.asm | 22 +++++++++++++++++++++ kernel.c | 40 ++++++++++++++++++++++++++++++++++++++ link.ld | 9 +++++++++ 5 files changed, 131 insertions(+) create mode 100644 .gitignore create mode 100755 build.sh create mode 100644 kernel-bootstrap.asm create mode 100644 kernel.c create mode 100644 link.ld diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8bacbce --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +bin/ \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..febb1eb --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash +mkdir -p bin +rm -f bin/* +nasm -f elf32 kernel-bootstrap.asm -o bin/kernel-bootstrap.o +gcc -m32 -std=c99 -c kernel.c -o bin/kernelc.o +ld -m elf_i386 -T link.ld -o bin/kernel bin/kernel-bootstrap.o bin/kernelc.o diff --git a/kernel-bootstrap.asm b/kernel-bootstrap.asm new file mode 100644 index 0000000..9e3b10e --- /dev/null +++ b/kernel-bootstrap.asm @@ -0,0 +1,22 @@ +bits 32 ; nasm 32-bit mode +section .text + + ; multiboot header +align 4 +dd 0x1BADB002 +dd 0x00 +dd - (0x1BADB002 + 0x00) ; checksum + +global start +extern kernel_entrypoint + + ; call kernel and halt +start: + cli ; disable interrups + mov esp, stack_space + call kernel_entrypoint + hlt + +section .bss +resb 8192 +stack_space: \ No newline at end of file diff --git a/kernel.c b/kernel.c new file mode 100644 index 0000000..1c3a97c --- /dev/null +++ b/kernel.c @@ -0,0 +1,40 @@ + +#define FRAME_SIZE (80 * 25 * 2) // 80 cols, 25 rows, 2 bytes per char + +char *video_ram = (char *) 0xB8000; +int cursor_pos = 0; + +void clear_screen() +{ + for (int i = 0; i < FRAME_SIZE; i = i + 2) + { + video_ram[i] = ' '; + video_ram[i + 1] = 0x07; + }; + cursor_pos = 0; +} + +void print(char *msg) +{ + int j = 0; + while (msg[j] != '\0') + { + video_ram[cursor_pos++] = msg[j]; + video_ram[cursor_pos++] = 0x07; + ++j; + } +} + + +void run_kern() +{ + clear_screen(); + + print("I am a kernel!"); + print(" another message"); +} + +void kernel_entrypoint() +{ + run_kern(); +} diff --git a/link.ld b/link.ld new file mode 100644 index 0000000..dae6b25 --- /dev/null +++ b/link.ld @@ -0,0 +1,9 @@ +OUTPUT_FORMAT(elf32-i386) +ENTRY(start) +SECTIONS + { + . = 0x100000; + .text : { *(.text) } + .data : { *(.data) } + .bss : { *(.bss) } + } \ No newline at end of file -- cgit v1.2.3