diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2018-08-28 14:58:53 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2018-08-28 14:58:53 +0100 |
| commit | e88de0162cff8bbad80972c1b92355b9d2db0213 (patch) | |
| tree | 625f5544459177fbe54161bc89887b0288a36c29 | |
| parent | f85dc5011b3ff2342c6129eafb038ae11fef44a3 (diff) | |
| download | tinyOS-e88de0162cff8bbad80972c1b92355b9d2db0213.tar.xz tinyOS-e88de0162cff8bbad80972c1b92355b9d2db0213.zip | |
Add bootable kernel with basic print function
| -rw-r--r-- | .gitignore | 54 | ||||
| -rwxr-xr-x | build.sh | 6 | ||||
| -rw-r--r-- | kernel-bootstrap.asm | 22 | ||||
| -rw-r--r-- | kernel.c | 40 | ||||
| -rw-r--r-- | link.ld | 9 |
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(); +} @@ -0,0 +1,9 @@ +OUTPUT_FORMAT(elf32-i386) +ENTRY(start) +SECTIONS + { + . = 0x100000; + .text : { *(.text) } + .data : { *(.data) } + .bss : { *(.bss) } + }
\ No newline at end of file |