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.