mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
60 lines
2.5 KiB
Text
60 lines
2.5 KiB
Text
FreeLoader notes (for x86 PC architecture only!)
|
|
================================================
|
|
|
|
Memory layout (WARNING: may be out-of-date)
|
|
-~-~-~-~-~-~-
|
|
|
|
0000:0000 - 0000:0FFF: Interrupt vector table & BIOS data
|
|
0000:1000 - 0000:6FFF: Real mode stack area
|
|
0000:7000 - 0000:7FFF: Cmdline (multiboot)
|
|
0000:8000 - xxxx:xxxx: FreeLoader program & data area
|
|
xxxx:xxxx - 7000:7FFF: Random memory allocation heap
|
|
7000:8000 - 7000:FFFF: Protected mode stack area
|
|
8000:0000 - 8000:FFFF: File system read buffer
|
|
9000:0000 - 9000:FFFF: Disk read buffer for BIOS Int 13h
|
|
A000:0000 - FFFF:FFFF: reserved
|
|
|
|
|
|
FreeLoader Boot Process
|
|
-~-~-~-~-~-~-~-~-~-~-~-
|
|
|
|
FAT 12/16/32 Boot Sector
|
|
|
|
The BIOS loads the boot sector at 0000:7C00. The FAT12/16 boot sector just
|
|
searches for FREELDR.SYS and loads its first 512 bytes to 0000:F800. This extra
|
|
helper code enables it to fully navigate the file allocation table. The boot
|
|
sector then jumps to FREELDR.SYS entry point at 0000:F803 and the helper code
|
|
takes the relay. It finishes loading the FREELDR.SYS image and finally jumps to
|
|
its final entry point at 0000:FA00.
|
|
The FAT32 boot sector loads its extra sector at 0000:7E00 and looks for
|
|
FREELDR.SYS on the file system. Once found it loads FREELDR.SYS to 0000:F800
|
|
and jumps to its entry point at the same address. This allows it to jump over
|
|
the FAT12/16 extra helper code situated at this address, and go to the final
|
|
entry point at 0000:FA00.
|
|
|
|
|
|
ISO-9660 (CD-ROM) Boot Sector
|
|
|
|
The BIOS loads the boot sector (2048 bytes) at 0000:7C00. First, the
|
|
boot sector relocates itself to 0000:7000 (up to 0000:7800). Then it looks
|
|
for the LOADER directory and makes it the current directory. Next it looks
|
|
for FREELDR.SYS and loads it at 0000:F800. Finally it restores the boot drive
|
|
number in the DL register and jumps to FreeLoader's entry point at 0000:F800.
|
|
|
|
|
|
Multiboot
|
|
|
|
Freeldr contains a multiboot signature and can itself be loaded by a
|
|
multiboot-compliant loader (like GRUB). The multiboot header instructs the
|
|
primary loader to load FREELDR.SYS at 0x200000 (needs to be above 1MB). Control
|
|
is then transferred to the multiboot entry point. Since FREELDR.SYS expects to
|
|
be loaded at a base address 0000:F800 it will start by relocating itself there
|
|
and then jumping to the relocated copy.
|
|
|
|
|
|
FreeLoader Initialization
|
|
-~-~-~-~-~-~-~-~-~-~-~-~-
|
|
|
|
When FreeLoader gets control it saves the boot drive and partition, passed
|
|
to it respectively in the DL and DH registers, and sets up the stack, enables
|
|
protected mode, and calls BootMain().
|