actually jump to 'kernel'

This commit is contained in:
andromeda
2026-03-03 15:57:17 +01:00
parent 8dee59b744
commit 31c486acda
4 changed files with 197 additions and 21 deletions

21
README.md Normal file
View File

@@ -0,0 +1,21 @@
# bootler
hobby bootloader written in asm. It's just for playing around... for now :p
### memory map
+------ 0x00100000 ------+
| hardware, bios stuff |
+------ 0x00080000 ------+
| pm stack (esp) | from boot.asm
+------ 0x00010200 ------+
| kernel (kernel.asm) |
+------ 0x00010000 ------+
| free |
+------ 0x00007E00 ------+
| bootloader (boot.asm) |
+------ 0x00007C00 ------+
| real mode stack (sp) | from boot.asm
+------ 0x00000500 ------+
| bios stuff |
+------ 0x00000000 ------+

162
boot.asm
View File

@@ -1,27 +1,157 @@
; yoinked from osdev.org ; bootler
mov ax, 0x07C0 ; legacy bootloader in nasm-flavoured asm
; 2026 Andromeda
; GPL licensed
[bits 16]
[org 0x7C00] ; address where bootloader is loaded
xor ax, ax
mov ds, ax mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
mov si, msg mov ah, 0x0E
cld mov al, 'R'
int 0x10
mov al, 'e'
int 0x10
mov al, 'a'
int 0x10
mov al, 'l'
int 0x10
mov al, 0x0D
int 0x10
mov al, 0x0A
int 0x10
mov al, 0x00 ; stops serial and bios output from overlapping in qemu -nographic
int 0x10 ; output
ch_loop: ; activate a20
lodsb mov ax, 0x2401
; hang if at null terminator int 0x15
or al, al jc error
jz hang
; BIOS interrupt prints al ; load kernel
mov ah, 0x0E ; 'docs' from https://www.ctyme.com/intr/rb-0607.htm
mov bh, 0 mov ah, 0x02
mov al, 1 ; number of sectors to read (must be nonzero)
mov ch, 0 ; low eight bits of cylinder number
mov cl, 2 ; sector number 1-63 (bits 0-5); high two bits of cylinder (bits 6-7,
; hard disk only)
mov dh, 0 ; head number
; dl is already set by bios
mov bx, 0x1000 ; data buffer
mov es, bx
xor bx, bx
int 0x13 ; read disk
jc error
; load gdt
lgdt [gdt_descriptor]
; jump to pm
cli
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 0x08:pm_start
error:
mov al, 'e'
int 0x10 int 0x10
mov al, 'r'
int 0x10
mov al, 'r'
int 0x10
mov al, 'o'
int 0x10
mov al, 'r'
int 0x10
jmp $
jmp ch_loop gdt_data:
; null segment
dq 0x0000000000000000
; code segment
dw 0xFFFF
dw 0x0000
hang: db 0x00
jmp hang db 10011010b ; 32-bit code segment, present, ring 0
db 11001111b ; limit bits 16-19
db 0x00
msg db 'Hello World', 0 ; data segment
dw 0xFFFF
dw 0x0000
db 0x00
db 10010010b ; 32-bit data segment, present, ring 0
db 11001111b ; limit bits 16-19
db 0x00
gdt_descriptor:
dw $ - gdt_data - 1 ; size
dd gdt_data ; start
[bits 32]
; entry point
pm_start:
; data segment registers
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0x80000
; TODO actually configure COM1
mov dx, 0x3F8 ; COM1
mov al, 'P'
out dx, al
mov al, 'r'
out dx, al
mov al, 'o'
out dx, al
mov al, 't'
out dx, al
mov al, 'e'
out dx, al
mov al, 'c'
out dx, al
mov al, 't'
out dx, al
mov al, 'e'
out dx, al
mov al, 'd'
out dx, al
mov al, 0x0D
out dx, al
mov al, 0x0A
out dx, al
jmp 0x08:0x10000
pm_error:
mov al, 'p'
out dx, al
mov al, 'm'
out dx, al
mov al, 'e'
out dx, al
mov al, 'r'
out dx, al
mov al, 'r'
out dx, al
mov al, 'o'
out dx, al
mov al, 'r'
out dx, al
jmp $
times 510-($-$$) db 0 ; 2 bytes less now times 510-($-$$) db 0 ; 2 bytes less now
db 0x55 db 0x55

23
kernel.asm Normal file
View File

@@ -0,0 +1,23 @@
[bits 32]
mov al, 'K'
out dx, al
mov al, 'e'
out dx, al
mov al, 'r'
out dx, al
mov al, 'n'
out dx, al
mov al, 'e'
out dx, al
mov al, 'l'
out dx, al
mov al, 0x0D
out dx, al
mov al, 0x0A
out dx, al
mov al, 0x00
out dx, al
jmp $
times 512-($-$$) db 0

View File

@@ -11,7 +11,12 @@ in
version = "0.1.0"; version = "0.1.0";
src = ./.; src = ./.;
buildPhase = '' buildPhase = ''
${nasm}/bin/nasm boot.asm -o ${bootImg} ${nasm}/bin/nasm boot.asm -o boot.bin
${nasm}/bin/nasm kernel.asm -o kernel.bin
dd if=/dev/zero of=${bootImg} bs=512 count=2
dd if=boot.bin of=${bootImg} conv=notrunc
dd if=kernel.bin of=${bootImg} bs=512 seek=1 conv=notrunc
''; '';
installPhase = '' installPhase = ''
mkdir -p $out/bin mkdir -p $out/bin
@@ -26,13 +31,10 @@ in
cp $(echo $out)/bin/${bootImg} ./.bootler/${bootImg} cp $(echo $out)/bin/${bootImg} ./.bootler/${bootImg}
chmod a+w ./.bootler/${bootImg} chmod a+w ./.bootler/${bootImg}
echo "press any key to continue. Qemu will clear the screen..."
read -s -n 1
# run image # run image
${qemu}/bin/qemu-system-x86_64 \ ${qemu}/bin/qemu-system-x86_64 \
-nographic \ -nographic \
-hda ./.bootler/${bootImg} -drive file=./.bootler/${bootImg},format=raw,index=0,media=disk
# clean up # clean up
rm ./.bootler -r rm ./.bootler -r