summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/dummy.binbin0 -> 512 bytes
-rw-r--r--bootloader.asm12
-rwxr-xr-xbuild/bootloader.sh3
-rwxr-xr-xbuild/compile.sh7
-rwxr-xr-xbuild/splicetobootsect.sh18
-rw-r--r--linker.ld44
-rwxr-xr-xrunemu.sh4
-rw-r--r--src/kernel/main.c11
8 files changed, 99 insertions, 0 deletions
diff --git a/bin/dummy.bin b/bin/dummy.bin
new file mode 100644
index 0000000..6f2016c
--- /dev/null
+++ b/bin/dummy.bin
Binary files differ
diff --git a/bootloader.asm b/bootloader.asm
new file mode 100644
index 0000000..181c1dc
--- /dev/null
+++ b/bootloader.asm
@@ -0,0 +1,12 @@
+
+ mov cx, 0x10
+ mov ah, 0x0A
+ mov al, 0x74
+ int 0x10
+
+hang:
+ jmp hang
+
+ times 510-($-$$) db 0
+ db 0x55
+ db 0xAA
diff --git a/build/bootloader.sh b/build/bootloader.sh
new file mode 100755
index 0000000..b56bb3d
--- /dev/null
+++ b/build/bootloader.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+FILENAME="bootloader"
+nasm "$FILENAME".asm -f bin -o "$FILENAME".bin
diff --git a/build/compile.sh b/build/compile.sh
new file mode 100755
index 0000000..efd8962
--- /dev/null
+++ b/build/compile.sh
@@ -0,0 +1,7 @@
+#! /bin/sh
+IN=$1
+FILE=$(basename $1)
+gcc -masm=intel -nostartfiles -nostdlib -ffreestanding "$IN".c -o "tmp/$FILE".o
+objcopy -S -R .note.gnu.build-id -R .comment -O binary "tmp/$FILE".o "bim/$FILE".bin
+rm "$IN".o
+
diff --git a/build/splicetobootsect.sh b/build/splicetobootsect.sh
new file mode 100755
index 0000000..6a2c353
--- /dev/null
+++ b/build/splicetobootsect.sh
@@ -0,0 +1,18 @@
+#! /bin/bash
+if [[ $1 == "" ]]; then
+ echo "Argument must be the path to a binary to splice into a bootsector"
+ exit 1
+fi
+
+INSIZE=$(stat -c%s $1)
+if [ $INSIZE -ge 510 ]; then
+ echo "Input file is greater than bootsector max size: 510 bytes."
+ exit 1
+fi
+
+OUTFILE="$(basename $1)_with_bootsect.bin"
+echo "Initializing output file"
+dd if=bin/dummy.bin of="$OUTFILE" >/dev/null 2>&1
+echo "Splicing binary"
+dd if="$1" of="$OUTFILE" conv=notrunc >/dev/null 2>&1
+echo "Done"
diff --git a/linker.ld b/linker.ld
new file mode 100644
index 0000000..1b34e93
--- /dev/null
+++ b/linker.ld
@@ -0,0 +1,44 @@
+/* The bootloader will look at this image and start execution at the symbol
+ designated as the entry point. */
+ENTRY(_start)
+
+/* Tell where the various sections of the object files will be put in the final
+ kernel image. */
+SECTIONS
+{
+ /* Begin putting sections at 1 MiB, a conventional place for kernels to be
+ loaded at by the bootloader. */
+ . = 1M;
+
+ /* First put the multiboot header, as it is required to be put very early
+ early in the image or the bootloader won't recognize the file format.
+ Next we'll put the .text section. */
+ .text BLOCK(4K) : ALIGN(4K)
+ {
+ *(.multiboot)
+ *(.text)
+ }
+
+ /* Read-only data. */
+ .rodata BLOCK(4K) : ALIGN(4K)
+ {
+ *(.rodata)
+ }
+
+ /* Read-write data (initialized) */
+ .data BLOCK(4K) : ALIGN(4K)
+ {
+ *(.data)
+ }
+
+ /* Read-write data (uninitialized) and stack */
+ .bss BLOCK(4K) : ALIGN(4K)
+ {
+ *(COMMON)
+ *(.bss)
+ *(.bootstrap_stack)
+ }
+
+ /* The compiler may produce other sections, by default it will put them in
+ a segment with the same name. Simply add stuff here as needed. */
+}
diff --git a/runemu.sh b/runemu.sh
new file mode 100755
index 0000000..aaee739
--- /dev/null
+++ b/runemu.sh
@@ -0,0 +1,4 @@
+#! /bin/sh
+
+qemu-system-x86_64 "$1"
+
diff --git a/src/kernel/main.c b/src/kernel/main.c
new file mode 100644
index 0000000..90f82f4
--- /dev/null
+++ b/src/kernel/main.c
@@ -0,0 +1,11 @@
+int func() {
+ asm(
+ ".intel_syntax noprefix \n"
+ "mov eax, 42 \n"
+ "ret \n"
+ );
+}
+
+int _start() {
+ return 1;
+}