diff options
-rw-r--r-- | bin/dummy.bin | bin | 0 -> 512 bytes | |||
-rw-r--r-- | bootloader.asm | 12 | ||||
-rwxr-xr-x | build/bootloader.sh | 3 | ||||
-rwxr-xr-x | build/compile.sh | 7 | ||||
-rwxr-xr-x | build/splicetobootsect.sh | 18 | ||||
-rw-r--r-- | linker.ld | 44 | ||||
-rwxr-xr-x | runemu.sh | 4 | ||||
-rw-r--r-- | src/kernel/main.c | 11 |
8 files changed, 99 insertions, 0 deletions
diff --git a/bin/dummy.bin b/bin/dummy.bin Binary files differnew file mode 100644 index 0000000..6f2016c --- /dev/null +++ b/bin/dummy.bin 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; +} |