Bootloader
This commit is contained in:
parent
01c4483b06
commit
db66b8bc3c
7 changed files with 357 additions and 3 deletions
71
README.md
71
README.md
|
@ -3,3 +3,74 @@
|
||||||
A tiny 32-bit x86 operating system kernel
|
A tiny 32-bit x86 operating system kernel
|
||||||
|
|
||||||
http://3zanders.co.uk/2017/10/13/writing-a-bootloader/
|
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
18
boot1.asm
Normal 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
66
boot2.asm
Normal 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
81
boot3.asm
Normal 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
85
boot4.asm
Normal 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
8
fun.zig
Normal 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
25
linker.ld
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
ENTRY(boot)
|
||||||
|
SECTIONS {
|
||||||
|
. = 0x7c00;
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.boot)
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
}
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue