Bootloader

This commit is contained in:
Armin Friedl 2025-01-11 19:54:50 +01:00
parent 01c4483b06
commit db66b8bc3c
7 changed files with 357 additions and 3 deletions

View file

@ -3,3 +3,74 @@
A tiny 32-bit x86 operating system kernel
http://3zanders.co.uk/2017/10/13/writing-a-bootloader/
## Real Mode Boot 1
16-bit mode.
Assemble with
``` shell
nasm -f bin boot1.asm -o boot1.bin
```
Run with
``` shell
qemu-system-x86_64 -fda boot1.bin
```
## Protected Mode Boot 2
32-bit mode.
Assemble with
``` shell
nasm -f bin boot2.asm -o bin2.bin
```
Run with
``` shell
qemu-system-x86_64 -fda boot2.bin
```
## Extended Boot 3
32-bit, 1024 byte.
Assemble with
``` shell
nasm -f bin boot3.asm -o boot3.bin
```
Run with
``` shell
qemu-system-x86_64 -fda boot3.bin
```
## Linking with Zig
32-bit, 1024 byte, building and linking in Zig code.
Build with
``` shell
zig build-exe boot4.o fun.zig -T linker.ld -nostdlib -target x86-freestanding
```
Convert to raw binary (strip ELF)
```shell
objcopy -Obinary fun fun.bin
```
Run with
``` shell
qemu-system-x86_64 -fda fun.bin
```

18
boot1.asm Normal file
View file

@ -0,0 +1,18 @@
bits 16
org 0x7c00
boot:
mov si,hello
mov ah,0x0e
.loop:
lodsb
or al,al
jz halt
int 0x10
jmp .loop
halt:
cli
hlt
hello: db "Hello world!",0
times 510 - ($-$$) db 0
dw 0xaa55

66
boot2.asm Normal file
View file

@ -0,0 +1,66 @@
bits 16
org 0x7c00
boot:
mov ax, 0x2401
int 0x15
mov ax, 0x3
int 0x10
cli
lgdt [gdt_pointer]
mov eax, cr0
or eax,0x1
mov cr0, eax
jmp CODE_SEG:boot2
gdt_start:
dq 0x0
gdt_code:
dw 0xFFFF
dw 0x0
db 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xFFFF
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_pointer:
dw gdt_end - gdt_start
dd gdt_start
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
bits 32
boot2:
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esi,hello
mov ebx,0xb8000
.loop:
lodsb
or al,al
jz halt
or eax,0x0100
mov word [ebx], ax
add ebx,2
jmp .loop
halt:
cli
hlt
hello: db "Hello world!",0
times 510 - ($-$$) db 0
dw 0xaa55

81
boot3.asm Normal file
View file

@ -0,0 +1,81 @@
bits 16
org 0x7c00
boot:
mov ax, 0x2401
int 0x15
mov ax, 0x3
int 0x10
mov [disk],dl
mov ah, 0x2 ;read sectors
mov al, 1 ;sectors to read
mov ch, 0 ;cylinder idx
mov dh, 0 ;head idx
mov cl, 2 ;sector idx
mov dl, [disk] ;disk idx
mov bx, copy_target;target pointer
int 0x13
cli
lgdt [gdt_pointer]
mov eax, cr0
or eax,0x1
mov cr0, eax
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp CODE_SEG:boot2
gdt_start:
dq 0x0
gdt_code:
dw 0xFFFF
dw 0x0
db 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xFFFF
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_pointer:
dw gdt_end - gdt_start
dd gdt_start
disk:
db 0x0
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
times 510 - ($-$$) db 0
dw 0xaa55
copy_target:
bits 32
hello: db "Hello more than 512 bytes world!!",0
boot2:
mov esi,hello
mov ebx,0xb8000
.loop:
lodsb
or al,al
jz halt
or eax,0x0100
mov word [ebx], ax
add ebx,2
jmp .loop
halt:
cli
hlt
times 1024 - ($-$$) db 0

85
boot4.asm Normal file
View file

@ -0,0 +1,85 @@
section .boot
bits 16
global boot
boot:
mov ax, 0x2401
int 0x15
mov ax, 0x3
int 0x10
mov [disk],dl
mov ah, 0x2 ;read sectors
mov al, 6 ;sectors to read
mov ch, 0 ;cylinder idx
mov dh, 0 ;head idx
mov cl, 2 ;sector idx
mov dl, [disk] ;disk idx
mov bx, copy_target;target pointer
int 0x13
cli
lgdt [gdt_pointer]
mov eax, cr0
or eax,0x1
mov cr0, eax
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp CODE_SEG:boot2
gdt_start:
dq 0x0
gdt_code:
dw 0xFFFF
dw 0x0
db 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xFFFF
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_pointer:
dw gdt_end - gdt_start
dd gdt_start
disk:
db 0x0
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
times 510 - ($-$$) db 0
dw 0xaa55
copy_target:
bits 32
hello: db "Hello more than 512 bytes world!!",0
boot2:
mov esi,hello
mov ebx,0xb8000
.loop:
lodsb
or al,al
jz halt
or eax,0x0F00
mov word [ebx], ax
add ebx,2
jmp .loop
halt:
mov esp,kernel_stack_top
extern kmain
call kmain
cli
hlt
section .bss
align 4
kernel_stack_bottom: equ $
resb 16384 ; 16 KB
kernel_stack_top:

8
fun.zig Normal file
View file

@ -0,0 +1,8 @@
export fn kmain() callconv(.C) void {
const color: c_short = @intCast(0x0F00);
const hello: [*:0]const u8 = "Hello zig world!";
var vga: [*]c_short = @ptrFromInt(0xb8000);
for (0..16) |i| {
vga[i+80] = color | hello[i];
}
}

25
linker.ld Normal file
View file

@ -0,0 +1,25 @@
ENTRY(boot)
SECTIONS {
. = 0x7c00;
.text :
{
*(.boot)
*(.text)
}
.rodata :
{
*(.rodata)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}