diff options
| author | Carlos Maiolino <[email protected]> | 2025-07-17 19:20:28 +0200 |
|---|---|---|
| committer | Carlos Maiolino <[email protected]> | 2025-07-17 19:20:28 +0200 |
| commit | d8392002629bc97c05ca82961c7ab3439ed7248e (patch) | |
| tree | dfd3f7dafd4e9efe10fe87b383c78430379580b9 | |
| parent | 7bcc28cb58e99927e14636fe199c5345f6c63a6f (diff) | |
Start writing the kernel and add a linker script
Move the code unders [BITS 32] label to its own file to be loaded as a
kernel by the boot loader.
Add a linker script to link the bootloader and the kernel in a single
binary file.
Add a build script to make it easier to use the cross compiler
Update the Makefile to build everything and pack it into the os.bin
Signed-off-by: Carlos Maiolino <[email protected]>
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Makefile | 19 | ||||
| -rwxr-xr-x[-rw-r--r--] | build.sh | 0 | ||||
| -rw-r--r-- | src/boot/bootloader.asm | 29 | ||||
| -rw-r--r-- | src/kernel.asm | 27 | ||||
| -rw-r--r-- | src/linker.ld | 27 |
6 files changed, 77 insertions, 26 deletions
@@ -1 +1,2 @@ *.bin +build/cemOS.o build/kernel.asm.o @@ -1,7 +1,24 @@ +FILLES = ./build/kernel.asm.o + BOOTLOADER=./src/boot/bootloader.asm TARGET=./bin/boot.bin -all: +all: ./bin/boot.bin ./bin/kernel.bin + rm -rf ./bin/os.bin + dd if=./bin/boot.bin >> ./bin/os.bin + dd if=./bin/kernel.bin >> ./bin/os.bin + dd if=/dev/zero bs=512 count=100 >> ./bin/os.bin +./bin/kernel.bin: ./build/kernel.asm.o + i686-elf-ld -g -relocatable ./build/kernel.asm.o -o ./build/cemOS.o + i686-elf-gcc -T ./src/linker.ld -o ./bin/kernel.bin -ffreestanding -O0 -nostdlib ./build/cemOS.o + +./bin/boot.bin: ./src/boot/bootloader.asm nasm -f bin $(BOOTLOADER) -o $(TARGET) + +./build/kernel.asm.o: ./src/kernel.asm + nasm -f elf -g ./src/kernel.asm -o ./build/kernel.asm.o + clean: rm -f $(TARGET) + rm -f build/cemOS.o + rm -f build/kernel.asm.o diff --git a/src/boot/bootloader.asm b/src/boot/bootloader.asm index fc17af8..eb226a6 100644 --- a/src/boot/bootloader.asm +++ b/src/boot/bootloader.asm @@ -3,6 +3,7 @@ BITS 16 CODE_SEG equ gdt_code - gdt_start ; 0x8 DATA_SEG equ gdt_data - gdt_start ; 0x10 + _start: jmp short start nop @@ -34,7 +35,9 @@ step2: mov eax, cr0 or eax, 0x1 mov cr0, eax - jmp CODE_SEG:start_32 + + jmp $ +; jmp CODE_SEG:start_32 ; GDT table description gdt_start: @@ -71,30 +74,6 @@ gdt_table: dw gdt_end - gdt_start - 1 dd gdt_start - -[BITS 32] - -; No access to BIOS from now on.... -start_32: - ; Set all segments to the same as the DATA_SEG - mov ax, DATA_SEG - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - - ; Set the stack pointer and base pointer further in mem - mov ebp, 0x00200000 - mov esp, ebp - - ; Enable A20 line - in al, 0x92 - or al, 2 - out 0x92, al - - jmp $ - ; Fill in to the end and add bootloader signature times 510 - ($ - $$) db 0 dw 0xAA55 diff --git a/src/kernel.asm b/src/kernel.asm new file mode 100644 index 0000000..93afff7 --- /dev/null +++ b/src/kernel.asm @@ -0,0 +1,27 @@ +[BITS 32] +global _start + +CODE_SEG equ 0x08 +DATA_SEG equ 0x10 + +; No access to BIOS from now on.... +_start: + ; Set all segments to the same as the DATA_SEG + mov ax, DATA_SEG + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + ; Set the stack pointer and base pointer further in mem + mov ebp, 0x00200000 + mov esp, ebp + + ; Enable A20 line + in al, 0x92 + or al, 2 + out 0x92, al + + jmp $ + diff --git a/src/linker.ld b/src/linker.ld new file mode 100644 index 0000000..9ea0171 --- /dev/null +++ b/src/linker.ld @@ -0,0 +1,27 @@ +ENTRY(_start) +OUTPUT_FORMAT(binary) + +SECTIONS { + . = 1M; + + .text : + { + *(.text) + } + + .rodata : + { + *(.rodata) + } + + .data : + { + *(.data) + } + + .bss : + { + *(COMMON) + *(.bss) + } +} |
