FreeBSD Architecture Handbook
Prev | Chapter 1 Bootstrapping and Kernel Initialization | Next

# 1.4 `boot0` Stage

Take a look at the file `/boot/boot0`. This is a small 512-byte file, and it is exactly what FreeBSD's installation procedure wrote to your harddisk's MBR if you chose the bootmanager option at installation time.

As mentioned previously, the `INT 0x19` instruction loads an MBR, i.e. the `boot0` content, into the memory at address 0x7c00. Taking a look at the file `sys/boot/i386/boot0/boot0.S` can give a guess at what is happening there - this is the boot manager, which is an awesome piece of code written by Robert Nordier.

The MBR, or, `boot0`, has a special structure starting from offset 0x1be, called the partition table. It has 4 records of 16 bytes each, called partition records, which represent how the harddisk(s) are partitioned, or, in FreeBSD's terminology, sliced. One byte of those 16 says whether a partition (slice) is bootable or not. Exactly one record must have that flag set, otherwise `boot0`'s code will refuse to proceed.

A partition record has the following fields:

- the 1-byte filesystem type

- the 1-byte bootable flag

- the 6 byte descriptor in CHS format

- the 8 byte descriptor in LBA format

A partition record descriptor has the information about where exactly the partition resides on the drive. Both descriptors, LBA and CHS, describe the same information, but in different ways: LBA (Logical Block Addressing) has the starting sector for the partition and the partition's length, while CHS (Cylinder Head Sector) has coordinates for the first and last sectors of the partition.

The boot manager scans the partition table and prints the menu on the screen so the user can select what disk and what slice to boot. By pressing an appropriate key, `boot0` performs the following actions:

- modifies the bootable flag for the selected partition to make it bootable, and clears the previous

- saves itself to disk to remember what partition (slice) has been selected so to use it as the default on the next boot

- loads the first sector of the selected partition (slice) into memory and jumps there

What kind of data should reside on the very first sector of a bootable partition (slice), in our case, a FreeBSD slice? As you may have already guessed, it is `boot2`.

Prev | Home | Next
BIOS POST | Up | `boot2` Stage