From c0ab4a627bca92268b9ecadc03298b8573b5d2ae Mon Sep 17 00:00:00 2001 From: iximeow Date: Wed, 24 Sep 2014 12:15:06 -0700 Subject: Initial commit --- bin/dummy.bin | Bin 0 -> 512 bytes bootloader.asm | 12 ++++++++++++ build/bootloader.sh | 3 +++ build/compile.sh | 7 +++++++ build/splicetobootsect.sh | 18 ++++++++++++++++++ linker.ld | 44 ++++++++++++++++++++++++++++++++++++++++++++ runemu.sh | 4 ++++ src/kernel/main.c | 11 +++++++++++ 8 files changed, 99 insertions(+) create mode 100644 bin/dummy.bin create mode 100644 bootloader.asm create mode 100755 build/bootloader.sh create mode 100755 build/compile.sh create mode 100755 build/splicetobootsect.sh create mode 100644 linker.ld create mode 100755 runemu.sh create mode 100644 src/kernel/main.c diff --git a/bin/dummy.bin b/bin/dummy.bin new file mode 100644 index 0000000..6f2016c Binary files /dev/null and b/bin/dummy.bin 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; +} -- cgit v1.1