tabs/docs/bootloader.md

2.8 KiB

RoBootloader

Low Memory

start end use
0x00000 0x004ff BIOS stuff, don't touch
0x00500 0x06bff free space
0x06c00 0x07bff Bootloader stack
0x07c00 0x07dff Bootloader
0x07e00 0x07fff free space
0x08000 0x0ffff ELF file (64 sectors)
0x00000 0x7ffff free space
0x80000 0x9ffff EDBA, partially usable
0xa0000 0xfffff unusable

Higher Memory

start end use
0x00000 0xfffff Low memory
0x100000 0x200000 Kernel space

Bootsector layout

(all addresses are offsets from 0x7C00)

start end use
0x0000 ? Bootloader code
? 0x0193 padding
0x0194 0x01bd SFS header
0x01be ? padding
? 0x01fd data
0x01fe 0x01ff 0x55AA boot magic

Hard Drive layout

start end use
0x00000000 0x000001ff Bootloader code (including SFS superblock)
0x00000200 0x000081ff SFS reserved area (kernel ELF file)
0x00008200 ??? SFS data area
??? ??? SFS free area
??? 0x00ffffff SFS index area
0x01000000 end Unused (Disk size is set to 16MiB)

GDT

Entry Base Limit Flags Access Purpose
0x0 0x00000000 0x00000 0b0000 0b00000000 Null Segment
0x8 0x00000000 0xfffff 0b1100 0b10011110 Code Segment
0x10 0x00000000 0xfffff 0b1100 0b10010110 Data Segment

Known issues

Stack setup

As I don't quite get how segments work in real mode, there are most likely errors in the way I set up my stack. I'm going on a it works on my machine approach currently.

Kernel is not a file

I reserve 32KiB of SFS reserved area for the ELF file of the kernel. This is currently for "historic reasons" (a.k.a. I'm too lazy to load the filesystem in the bootloader). The kernel then handles the filesystem.

BSS does not get cleared

I do calculate the size of the BSS, so either I intialize every variable in a function or things like global variables that are false by default don't work. It does work in emulators because they initialize all memory to 0, but real computerss don't always do that.