aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Barnett <noreply@jamesbarnett.xyz>2018-08-28 14:58:53 +0100
committerJames Barnett <noreply@jamesbarnett.xyz>2018-08-28 14:58:53 +0100
commite88de0162cff8bbad80972c1b92355b9d2db0213 (patch)
tree625f5544459177fbe54161bc89887b0288a36c29
parentf85dc5011b3ff2342c6129eafb038ae11fef44a3 (diff)
downloadtinyOS-e88de0162cff8bbad80972c1b92355b9d2db0213.tar.xz
tinyOS-e88de0162cff8bbad80972c1b92355b9d2db0213.zip
Add bootable kernel with basic print function
-rw-r--r--.gitignore54
-rwxr-xr-xbuild.sh6
-rw-r--r--kernel-bootstrap.asm22
-rw-r--r--kernel.c40
-rw-r--r--link.ld9
5 files changed, 131 insertions, 0 deletions
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