Amaster boot record (MBR) is a type ofboot sector in the first block ofpartitioned computermass storage devices likefixed disks orremovable drives intended for use withIBM PC-compatible systems and beyond. The concept of MBRs was publicly introduced in 1983 withPC DOS 2.0.
The MBR holds the information on how the disc's sectors (A.K.A. "blocks") are divided into partitions, each partition notionally containing a file system. The MBR also contains executable code to function as a loader for the installed operating system—usually by passing control over to the loader's second stage, or in conjunction with each partition's volume boot record (VBR). This MBR code is usually referred to as a boot loader.
The organization of the partition table in the MBR limits the maximum addressable storage space of a partitioned disk to 2 TiB(232 × 512 bytes).[1] Approaches to slightly raise this limit utilizing 32-bit arithmetic or 4096-byte sectors are not officially supported, as they fatally break compatibility with existing boot loaders, most MBR-compliant operating systems and associated system tools, and may cause serious data corruption when used outside of narrowly controlled system environments. Therefore, the MBR-based partitioning scheme is in the process of being superseded by theGUID Partition Table (GPT) scheme in new computers. A GPT can coexist with an MBR in order to provide some limited form of backward compatibility for older systems.
MBRs are not present on non-partitioned media such asfloppies,superfloppies or other storage devices configured to behave as such, nor are they necessarily present on drives used in non-PC platforms.
Support for partitioned media, and thereby the master boot record (MBR), was introduced with IBMPC DOS 2.0 in March 1983 in order to support the 10 MBhard disk of the then-newIBM Personal Computer XT, still using theFAT12 file system. The original version of the MBR was written by David Litton of IBM in June 1982. The partition table supported up to fourprimary partitions. This did not change whenFAT16 was introduced as a new file system with DOS 3.0. Support for anextended partition, a special primary partition type used as a container to hold other partitions, was added with DOS 3.2, and nestedlogical drives inside an extended partition came with DOS 3.30. Since MS-DOS, PC DOS, OS/2 and Windows were never enabled to boot off them, the MBR format and boot code remained almost unchanged in functionality (except some third-party implementations) throughout the eras of DOS and OS/2 up to 1996.
In 1996, support forlogical block addressing (LBA) was introduced in Windows 95B and MS-DOS 7.10 (Not to be confused with IBM PC-DOS 7.1) in order to support disks larger than 8 GB.Disk timestamps were also introduced.[2] This also reflected the idea that the MBR is meant to be operating system and file system independent. However, this design rule was partially compromised in more recent Microsoft implementations of the MBR, which enforceCHS access forFAT16B andFAT32 partition types0x06/0x0B, whereas LBA is used for0x0E/0x0C.
Despite sometimes poor documentation of certain intrinsic details of the MBR format (which occasionally caused compatibility problems), it has been widely adopted as a de facto industry standard, due to the broad popularity of PC-compatible computers and its semi-static nature over decades. This was even to the extent of being supported by computer operating systems for other platforms. Sometimes this was in addition to other pre-existing orcross-platform standards for bootstrapping and partitioning.[3]
MBR partition entries and the MBR boot code used in commercial operating systems, however, are limited to 32 bits.[1] Therefore, the maximum disk size supported on disks using 512-byte sectors (whether real or emulated) by the MBR partitioning scheme (without 32-bit arithmetic) is limited to 2 TiB.[1] Consequently, a different partitioning scheme must be used for larger disks, as they have become widely available since 2010. The MBR partitioning scheme is therefore in the process of being superseded by theGUID Partition Table (GPT). The official approach does little more than ensuring data integrity by employing aprotective MBR. Specifically, it does not provide backward compatibility with operating systems that do not support the GPT scheme as well. Meanwhile, multiple forms ofhybrid MBRs have been designed and implemented by third parties in order to maintain partitions located in the first physical 2 TiB of a disk in both partitioning schemes "in parallel" and/or to allow older operating systems to boot off GPT partitions as well. The present non-standard nature of these solutions causes various compatibility problems in certain scenarios.
The MBR consists of 512 or morebytes located in the firstsector of the drive.
It may contain one or more of:
IBMPC DOS 2.0 introduced theFDISK
utility to set up and maintain MBR partitions. When a storage device has been partitioned according to this scheme, its MBR contains a partition table describing the locations, sizes, and other attributes of linear regions referred to as partitions.
The partitions themselves may also contain data to describe more complex partitioning schemes, such asextended boot records (EBRs),BSD disklabels, orLogical Disk Manager metadata partitions.[8]
The MBR is not located in a partition; it is located at a first sector of the device (physical offset 0), preceding the first partition. (The boot sector present on a non-partitioned device or within an individual partition is called avolume boot record instead.) In cases where the computer is running aDDO BIOS overlay orboot manager, the partition table may be moved to some other physical location on the device; e.g.,Ontrack Disk Manager often placed a copy of the original MBR contents in the second sector, then hid itself from any subsequently booted OS or application, so the MBR copy was treated as if it were still residing in the first sector.
By convention, there are exactly four primary partition table entries in the MBR partition table scheme, although some operating systems and system tools extended this to five (Advanced Active Partitions (AAP) withPTS-DOS 6.60[9] andDR-DOS 7.07), eight (AST andNECMS-DOS 3.x[10][11] as well asStorage DimensionsSpeedStor), or even sixteen entries (withOntrack Disk Manager).
Address | Description | Size (bytes) | |
---|---|---|---|
0x0000 (0) | Bootstrap code area | 446 | |
0x01BE (446) | Partition entry №1 | Partition table (for primary partitions) | 16 |
0x01CE (462) | Partition entry №2 | 16 | |
0x01DE (478) | Partition entry №3 | 16 | |
0x01EE (494) | Partition entry №4 | 16 | |
0x01FE (510) | 0x55 | Boot signature[a] | 2 |
0x01FF (511) | 0xAA | ||
Total size: 446 + 4×16 + 2 | 512 |
Address | Description | Size (bytes) | |
---|---|---|---|
0x0000 (0) | Bootstrap code area (part 1) | 218 | |
0x00DA (218) | 0x0000 | Disk timestamp[2][b] (optional; Windows 95B/98/98SE/ME (MS-DOS 7.1–8.0). Alternatively, can serve asOEM loader signature with NEWLDR) | 2 |
0x00DC (220) | Original physical drive(0x80 –0xFF ) | 1 | |
0x00DD (221) | Seconds (0–59) | 1 | |
0x00DE (222) | Minutes (0–59) | 1 | |
0x00DF (223) | Hours (0–23) | 1 | |
0x00E0 (224) | Bootstrap code area (part 2, code entry at0x0000 ) | 216 (or 222) | |
0x01B8 (440) | 32-bit disk signature | Disk signature (optional;UEFI, Linux,Windows NT family and other OSes) | 4 |
0x01BC (444) | 0x0000 (0x5A5A if copy-protected) | 2 | |
0x01BE (446) | Partition entry №1 | Partition table (for primary partitions) | 16 |
0x01CE (462) | Partition entry №2 | 16 | |
0x01DE (478) | Partition entry №3 | 16 | |
0x01EE (494) | Partition entry №4 | 16 | |
0x01FE (510) | 0x55 | Boot signature[a] | 2 |
0x01FF (511) | 0xAA | ||
Total size: 218 + 6 + 216 + 6 + 4×16 + 2 | 512 |
Address | Description | Size (bytes) | |
---|---|---|---|
0x0000 (0) | Bootstrap code area | 428 | |
0x01AC (428) | 0x78 | AAP signature (optional) | 2 |
0x01AD (429) | 0x56 | ||
0x01AE (430) | AAP physical drive (0x80 –0xFE ;0x00 : not used;0x01 –0x7F ,0xFF : reserved) | AAP record (optional) (AAPpartition entry #0 with special semantics) | 1 |
0x01AF (431) | CHS (start) address of AAP partition/image file orVBR/EBR | 3 | |
0x01B2 (434) | Reserved for AAPpartition type (0x00 if not used) (optional) | 1 | |
0x01B3 (435) | Reserved for CHS end address in AAP (optional; byte at offset0x01B5 is also used for MBR checksum (PTS DE, BootWizard);0x000000 if not used) | 3 | |
0x01B6 (438) | StartLBA of AAP image file orVBR/EBR or relative sectors of AAP partition (copied to offset+01Chex in the loaded sector over the "hidden sectors" entry of a DOS 3.31 BPB (or emulation thereof) to also support EBR booting) | 4 | |
0x01BA (442) | Reserved for sectors in AAP (optional;0x00000000 if not used) | 4 | |
0x01BE (446) | Partition entry №1 | Partition table (for primary partitions) | 16 |
0x01CE (462) | Partition entry №2 | 16 | |
0x01DE (478) | Partition entry №3 | 16 | |
0x01EE (494) | Partition entry №4 | 16 | |
0x01FE (510) | 0x55 | Boot signature[a] | 2 |
0x01FF (511) | 0xAA | ||
Total size: 428 + 2 + 16 + 4×16 + 2 | 512 |
Address | Description | Size (bytes) | |
---|---|---|---|
0x0000 (0) | JMPS (EBhex ) / NEWLDR record size (often0x0A /0x16 /0x1C for code start at0x000C /0x0018 /0x001E ) | NEWLDR record (optional) | 2 |
0x0002 (2) | "NEWLDR " signature | 6 | |
0x0008 (8) | LOADER physical drive and boot flag (0x80 –0xFE ,0x00 –0x7E ,0xFF ,0x7F ) (if not used, this and following 3 bytes must be all 0) | 1 | |
0x0009 (9) | CHS address of LOADER boot sector or image file (f.e.IBMBIO.LDR) (0x000000 if not used) | 3 | |
0x000C (12) | AllowedDL minimum, else take from partition table (0x80 : default;0x00 : always use DL;0xFF : always use table entry) | 1 | |
0x000D (13) | Reserved (default:0x000000 ) | 3 | |
0x0010 (16) | LBA of LOADER boot sector or image file (optional;0x00000000 if not used) | 4 | |
0x0014 (20) | Patch offset of VBR boot unit (default0x0000 if not used, else0024hex or01FDhex ) | 2 | |
0x0016 (22) | Checksum (0x0000 if not used) | 2 | |
0x0018 (24) | OEM loader signature ("MSWIN4 " forREAL/32, see also offset+0DAhex , corresponds with OEM label at offset+003hex in VBRs (optional) | 6 | |
Varies | Bootstrap code area (code entry at0x0000 ) | Varies | |
0x01AC (428) | 0x78 | AAP signature (optional) | 2 |
0x01AD (429) | 0x56 | ||
0x01AE (430) | AAP partition entry №0 with special semantics | AAP record (optional) | 16 |
0x01BE (446) | Partition entry №1 | Partition table (for primary partitions) | 16 |
0x01CE (462) | Partition entry №2 | 16 | |
0x01DE (478) | Partition entry №3 | 16 | |
0x01EE (494) | Partition entry №4 | 16 | |
0x01FE (510) | 0x55 | Boot signature[a] | 2 |
0x01FF (511) | 0xAA | ||
Total size: 30 + 398 + 2 + 16 + 4×16 + 2 | 512 |
Address | Description | Size (bytes) | |
---|---|---|---|
0x0000 (0) | Bootstrap code area | 380 | |
0x017C (380) | 0x5A | AST/NEC signature (optional; not for SpeedStor) | 2 |
0x017D (381) | 0xA5 | ||
0x017E (382) | Partition entry №8 | AST/NEC expanded partition table (optional; also for SpeedStor) | 16 |
0x018E (398) | Partition entry №7 | 16 | |
0x019E (414) | Partition entry №6 | 16 | |
0x01AE (430) | Partition entry №5 | 16 | |
0x01BE (446) | Partition entry №4 | Partition table (for primary partitions) | 16 |
0x01CE (462) | Partition entry №3 | 16 | |
0x01DE (478) | Partition entry №2 | 16 | |
0x01EE (494) | Partition entry №1 | 16 | |
0x01FE (510) | 0x55 | Boot signature[a] | 2 |
0x01FF (511) | 0xAA | ||
Total size: 380 + 2 + 4×16 + 4×16 + 2 | 512 |
Address | Description | Size (bytes) | |
---|---|---|---|
0x0000 (0) | Bootstrap code area | 252 | |
0x00FC (252) | 0xAA | DM signature (optional) | 2 |
0x00FD (253) | 0x55 | ||
0x00FE (254) | Partition entry | DM expanded partition table (optional) | 16 |
0x010E (270) | Partition entry | 16 | |
0x011E (286) | Partition entry | 16 | |
0x012E (302) | Partition entry | 16 | |
0x013E (318) | Partition entry | 16 | |
0x014E (334) | Partition entry | 16 | |
0x015E (350) | Partition entry | 16 | |
0x016E (366) | Partition entry | 16 | |
0x017E (382) | Partition entry | 16 | |
0x018E (398) | Partition entry | 16 | |
0x019E (414) | Partition entry | 16 | |
0x01AE (430) | Partition entry | 16 | |
0x01BE (446) | Partition entry №1 | Partition table (for primary partitions) | 16 |
0x01CE (462) | Partition entry №2 | 16 | |
0x01DE (478) | Partition entry №3 | 16 | |
0x01EE (494) | Partition entry №4 | 16 | |
0x01FE (510) | 0x55 | Boot signature[a] | 2 |
0x01FF (511) | 0xAA | ||
Total size: 252 + 2 + 12×16 + 4×16 + 2 | 512 |
Offset (bytes) | Field length | Description | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 1 byte | Status or physical drive (bit 7 set is for active or bootable, old MBRs only accept0x80,0x00 means inactive, and0x01–0x7F stand for invalid)[c] | ||||||||||||||||||
0x01 | 3 bytes | CHS address of first absolute sector in partition.[d] The format is described by three bytes, see the next three rows. | ||||||||||||||||||
0x01 | 1 byte |
| ||||||||||||||||||
0x02 | 1 byte |
| ||||||||||||||||||
0x03 | 1 byte |
| ||||||||||||||||||
0x04 | 1 byte | Partition type[14] | ||||||||||||||||||
0x05 | 3 bytes | CHS address of last absolute sector in partition.[d] The format is described by 3 bytes, see the next 3 rows. | ||||||||||||||||||
0x05 | 1 byte |
| ||||||||||||||||||
0x06 | 1 byte |
| ||||||||||||||||||
0x07 | 1 byte |
| ||||||||||||||||||
0x08 | 4 bytes | LBA of first absolute sector in the partition[f] | ||||||||||||||||||
0x0C | 4 bytes | Number of sectors in partition[g] |
An artifact of hard disk technology from the era of thePC XT, the partition table subdivides a storage medium using units ofcylinders,heads, andsectors (CHS addressing). These values no longer correspond to their namesakes in modern disk drives, as well as being irrelevant in other devices such assolid-state drives, which do not physically have cylinders or heads.
In the CHS scheme, sector indices have (almost) always begun with sector 1 rather than sector 0 by convention, and due to an error in all versions of MS-DOS/PC DOS up to including 7.10, the number of heads is generally limited to 255[h] instead of 256. When a CHS address is too large to fit into these fields, thetuple (1023, 254, 63) is typically used today, although on older systems, and with older disk tools, the cylinder value often wrapped around modulo the CHS barrier near 8 GB, causing ambiguity and risks of data corruption. (If the situation involves a "protective" MBR on a disk with a GPT, Intel'sExtensible Firmware Interface specification requires that the tuple (1023, 255, 63) be used.) The 10-bit cylinder value is recorded within two bytes in order to facilitate making calls to the original/legacyINT 13h BIOS disk access routines, where 16 bits were divided into sector and cylinder parts, and not on byte boundaries.[13]
Due to the limits of CHS addressing,[16][17] a transition was made to using LBA, orlogical block addressing. Both the partition length and partition start address are sector values stored in the partition table entries as 32-bit quantities. The sector size used to be considered fixed at 512 (29) bytes, and a broad range of important components includingchipsets,boot sectors,operating systems,database engines,partitioning tools,backup andfile system utilities and other software had this value hard-coded. Since the end of 2009, disk drives employing 4096-byte sectors (4Kn orAdvanced Format) have been available, although the size of the sector for some of these drives was still reported as 512 bytes to the host system through conversion in the hard-drive firmware and referred to as 512 emulation drives (512e).
Since block addresses and sizes are stored in the partition table of an MBR using 32 bits, the maximum size, as well as the highest start address, of a partition using drives that have 512-byte sectors (actual or emulated) cannot exceed 2TiB−512 bytes (2199023255040 bytes or4294967295 (232−1) sectors × 512 (29) bytes per sector).[1] Alleviating this capacity limitation was one of the prime motivations for the development of the GPT.
Since partitioning information is stored in the MBR partition table using a beginning block address and a length, it may in theory be possible to define partitions in such a way that the allocated space for a disk with 512-byte sectors gives a total size approaching 4 TiB, if all but one partition are located below the 2 TiB limit and the last one is assigned as starting at or close to block 232−1 and specify the size as up to 232−1, thereby defining a partition that requires 33 rather than 32 bits for the sector address to be accessed. However, in practice, only certainLBA-48-enabled operating systems, including Linux, FreeBSD and Windows 7[18] that use 64-bit sector addresses internally actually support this. Due to code space constraints and the nature of the MBR partition table to only support 32 bits, boot sectors, even if enabled to support LBA-48 rather thanLBA-28, often use 32-bit calculations, unless they are specifically designed to support the full address range of LBA-48 or are intended to run on 64-bit platforms only. Any boot code or operating system using 32-bit sector addresses internally would cause addresses to wrap around accessing this partition and thereby result in serious data corruption over all partitions.
For disks that present a sector size other than 512 bytes, such asUSBexternal drives, there are limitations as well. A sector size of 4096 results in an eight-fold increase in the size of a partition that can be defined using MBR, allowing partitions up to 16 TiB (232 × 4096 bytes) in size.[19] Versions of Windows more recent than Windows XP support the larger sector sizes, as well as Mac OS X, andLinux has supported larger sector sizes since 2.6.31[20] or 2.6.32,[21] but issues with boot loaders, partitioning tools and computer BIOS implementations present certain limitations,[22] since they are often hard-wired to reserve only 512 bytes for sector buffers, causing memory to become overwritten for larger sector sizes. This may cause unpredictable behaviour as well, and therefore should be avoided when compatibility and standard conformity is an issue.
Where a data storage device has been partitioned with the GPT scheme, the master boot record will still contain a partition table, but its only purpose is to indicate the existence of the GPT and to prevent utility programs that understand only the MBR partition table scheme from creating any partitions in what they would otherwise see as free space on the disk, thereby accidentally erasing the GPT.
OnIBM PC-compatible computers, thebootstrappingfirmware (contained within theROMBIOS) loads and executes the master boot record.[23] ThePC/XT (type 5160) used anIntel 8088microprocessor. In order to remain compatible, all x86 BIOS architecture systems start with the microprocessor in anoperating mode referred to asreal mode. The BIOS reads the MBR from the storage device intophysical memory, and then it directs the microprocessor to the start of the boot code. The BIOS will switch the processor to real mode, then begin to execute the MBR program, and so the beginning of the MBR is expected to contain real-modemachine code.[23]
Since the BIOS bootstrap routine loads and runs exactly one sector from the physical disk, having the partition table in the MBR with the boot code simplifies the design of the MBR program. It contains a small program that loads theVolume Boot Record (VBR) of the targeted partition. Control is then passed to this code, which is responsible for loading the actual operating system. This process is known aschain loading.
Popular MBR code programs were created for bootingPC DOS andMS-DOS, and similar boot code remains in wide use. These boot sectors expect theFDISK
partition table scheme to be in use and scans the list of partitions in the MBR's embedded partition table to find the only one that is marked with theactive flag.[24] It then loads and runs thevolume boot record (VBR) of the active partition.
There are alternative boot code implementations, some of which are installed byboot managers, which operate in a variety of ways. Some MBR code loads additional code for a boot manager from the first track of the disk, which it assumes to be "free" space that is not allocated to any disk partition, and executes it. A MBR program may interact with the user to determine which partition on which drive should boot, and may transfer control to the MBR of a different drive. Other MBR code contains a list of disk locations (often corresponding to the contents offiles in afilesystem) of the remainder of the boot manager code to load and to execute. (The first relies on behavior that is not universal across all disk partitioning utilities, most notably those that read and write GPTs. The last requires that the embedded list of disk locations be updated when changes are made that would relocate the remainder of the code.)
On machines that do not usex86 processors, or on x86 machines with non-BIOS firmware such asOpen Firmware orExtensible Firmware Interface (EFI) firmware, this design is unsuitable, and the MBR is not used as part of the system bootstrap.[25] EFI firmware is instead capable of directly understanding the GPT partitioning scheme and theFAT filesystem format, and loads and runs programs held as files in theEFI System partition.[26] The MBR will be involved only insofar as it might contain a partition table for compatibility purposes if the GPT partition table scheme has been used.
There is some MBR replacement code that emulates EFI firmware's bootstrap, which makes non-EFI machines capable of booting from disks using the GPT partitioning scheme. It detects a GPT, places the processor in the correct operating mode, and loads the EFI compatible code from disk to complete this task.
In addition to the bootstrap code and a partition table, master boot records may contain adisk signature. This is a 32-bit value that is intended to identify uniquely the disk medium (as opposed to the disk unit—the two not necessarily being the same for removable hard disks).
The disk signature was introduced by Windows NT version 3.5, but it is now used by several operating systems, including theLinux kernel version 2.6 and later. Linux tools can use the NT disk signature to determine which disk the machine booted from.[27]
Windows NT (and later Microsoft operating systems) uses the disk signature as an index to all the partitions on any disk ever connected to the computer under that OS; these signatures are kept inWindows Registry keys, primarily for storing the persistent mappings between disk partitions and drive letters. It may also be used in Windows NTBOOT.INI files (though most do not), to describe the location of bootable Windows NT (or later) partitions.[28] One key (among many), where NT disk signatures appear in a Windows 2000/XP registry, is:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\
If a disk's signature stored in the MBR wasA8 E1 B9 D2 (in that order) and its first partition corresponded with logical drive C: under Windows, then theREG_BINARY
data under the key value\DosDevices\C:
would be:
A8 E1 B9 D2 00 7E 00 00 00 00 00 00
The first four bytes are said disk signature. (In other keys, these bytes may appear in reverse order from that found in the MBR sector.) These are followed by eight more bytes, forming a 64-bit integer, inlittle-endian notation, which are used to locate the byte offset of this partition. In this case,00 7E corresponds to the hexadecimal value0x7E00 (32,256). Under the assumption that the drive in question reports a sector size of 512 bytes, then dividing this byte offset by 512 results in 63, which is the physical sector number (or LBA) containing the first sector of the partition (unlike thesector count used in the sectors value of CHS tuples, which counts fromone, the absolute or LBA sector value startscounting fromzero).
If this disk had another partition with the values00 F8 93 71 02 following the disk signature (under, e.g., the key value\DosDevices\D:
), it would begin at byte offset0x00027193F800 (10,495,457,280), which is also the first byte of physical sector20,498,940.
Starting withWindows Vista, the disk signature is also stored in theBoot Configuration Data (BCD) store, and the boot process depends on it.[29] If the disk signature changes, cannot be found or has a conflict, Windows is unable to boot.[30] Unless Windows is forced to use the overlapping part of the LBA address of the Advanced Active Partition entry as pseudo-disk signature, Windows' usage is conflictive with the Advanced Active Partition feature of PTS-DOS 7 and DR-DOS 7.07, in particular if their boot code is located outside the first 8 GB of the disk, so that LBA addressing must be used.
The MBR originated in thePC XT.[31]IBM PC-compatible computers arelittle-endian, which means theprocessor stores numeric values spanning two or more bytes in memoryleast significant byte first. The format of the MBR on media reflects this convention. Thus, the MBR signature will appear in adisk editor as the sequence55 AA
.[a]
The bootstrap sequence in the BIOS will load the first valid MBR that it finds into the computer'sphysical memory ataddress0x7C00 to0x7FFF.[31] The last instruction executed in the BIOS code will be a "jump" to that address in order to direct execution to the beginning of the MBR copy. The primary validation for most BIOSes is the signature at offset0x01FE, although a BIOS implementer may choose to include other checks, such as verifying that the MBR contains a valid partition table without entries referring to sectors beyond the reported capacity of the disk.
To the BIOS, removable (e.g. floppy) and fixed disks are essentially the same. For either, the BIOS reads the first physical sector of the media into RAM at absolute address0x7C00, checks the signature in the last two bytes of the loaded sector, and then, if the correct signature is found, transfers control to the first byte of the sector with a jump (JMP) instruction. The only real distinction that the BIOS makes is that (by default, or if the boot order is not configurable) it attempts to boot from the first removable disk before trying to boot from the first fixed disk. From the perspective of the BIOS, the action of the MBR loading a volume boot record into RAM is exactly the same as the action of a floppy disk volume boot record loading the object code of an operating system loader into RAM. In either case, the program that the BIOS loaded is going about the work of chain loading an operating system.
While the MBRboot sector code expects to be loaded at physical address0x0000:0x7C00,[i] all the memory from physical address0x0000:0x0501 (address0x0000:0x0500 is the last one used by a Phoenix BIOS)[13] to0x0000:0x7FFF,[31] later relaxed to0x0000:0xFFFF[32] (and sometimes[j] up to0x9000:0xFFFF)—the end of the first 640KB—is available in real mode.[k] TheINT 12h
BIOS interrupt call may help in determining how much memory can be allocated safely (by default, it simply reads the base memory size in KB fromsegment:offset location0x0040:0x0013, but it may be hooked by other resident pre-boot software like BIOS overlays,RPL code or viruses to reduce the reported amount of available memory in order to keep other boot stage software like boot sectors from overwriting them).
The last 66 bytes of the 512-byte MBR are reserved for the partition table and other information, so the MBR boot sector program must be small enough to fit within 446 bytes of memory or less.
The MBR code examines the partition table, selects a suitable partition and loads the program that will perform the next stage of the boot process, usually by making use of INT 13hBIOS calls. The MBR bootstrap code loads and runs (a boot loader- or operating system-dependent)volume boot record code that is located at the beginning of the "active" partition. The volume boot record will fit within a 512-byte sector, but it is safe for the MBR code to load additional sectors to accommodate boot loaders longer than one sector, provided they do not make any assumptions on what the sector size is. In fact, at least 1 KB of RAM is available at address0x7C00 in every IBM XT- and AT-class machine, so a 1 KB sector could be used with no problem. Like the MBR, a volume boot record normally expects to be loaded at address0x0000:0x7C00. This derives from the fact that the volume boot record design originated on unpartitioned media, where a volume boot record would be directly loaded by the BIOS boot procedure; as mentioned above, the BIOS treats MBRs and volume boot records (VBRs)[l] exactly alike. Since this is the same location where the MBR is loaded, one of the first tasks of an MBR is torelocate itself somewhere else in memory. The relocation address is determined by the MBR, but it is most often0x0000:0x0600 (for MS-DOS/PC DOS, OS/2 and Windows MBR code) or0x0060:0x0000 (most DR-DOS MBRs). (Even though both of these segmented addresses resolve to the same physical memory address in real mode, forApple Darwin to boot, the MBR must be relocated to0x0000:0x0600 instead of0x0060:0x0000, since the code depends on the DS:SI pointer to the partition entry provided by the MBR, but it erroneously refers to it via0x0000:SI only.[33]) It is important not to relocate to other addresses in memory because manyVBRs will assume a certain standard memory layout when loading their boot file.
TheStatus field in a partition table record is used to indicate an active partition. Standard-conformant MBRs will allow only one partition marked active and use this as part of a sanity-check to determine the existence of a valid partition table. They will display an error message, if more than one partition has been marked active. Some non-standard MBRs will not treat this as an error condition and just use the first marked partition in the row.
Traditionally, values other than0x00 (not active) and0x80 (active) were invalid and the bootstrap program would display an error message upon encountering them. However, thePlug and Play BIOS Specification andBIOS Boot Specification (BBS) allowed other devices to become bootable as well since 1994.[32][34] Consequently, with the introduction of MS-DOS 7.10 (Windows 95B) and higher, the MBR started to treat a set bit 7 as active flag and showed an error message for values0x01..0x7F only. It continued to treat the entry as physical drive unit to be used when loading the corresponding partition's VBR later on, thereby now also accepting other boot drives than0x80 as valid, however, MS-DOS did not make use of this extension by itself. Storing the actual physical drive number in the partition table does not normally cause backward compatibility problems, since the value will differ from0x80only on drives other than the first one (which have not been bootable before, anyway). However, even with systems enabled to boot off other drives, the extension may still not work universally, for example, after the BIOS assignment of physical drives has changed when drives are removed, added or swapped. Therefore, per theBIOS Boot Specification (BBS),[32] it is best practice for a modern MBR accepting bit 7 as active flag to pass on the DL value originally provided by the BIOS instead of using the entry in the partition table.
The MBR is loaded at memory location0x0000:0x7C00 and with the followingCPU registers set up when the prior bootstrap loader (normally theIPL in the BIOS) passes execution to it by jumping to0x0000:0x7C00 in the CPU'sreal mode.
Systems withPlug-and-Play BIOS or BBS support will provide a pointer to PnP data in addition to DL:[32][34]
By convention, a standard conformant MBR passes execution to a successfully loaded VBR, loaded at memory location0x0000:0x7C00, by jumping to0x0000:0x7C00 in the CPU's real mode with the following registers maintained or specifically set up:
0x000C
), translate Wyse non-standard drive units0x02..0x7F to0x80..0xFD, and optionally fix up the drive value (stored at offset0x019
in theExtended BIOS Parameter Block (EBPB) or at sector offset0x01FD
) in loaded VBRs before passing execution to them (see NEWLDR offset0x0014
)—this also allows other boot loaders to use NEWLDR as a chain-loader, configure its in-memory image on the fly and "tunnel" the loading of VBRs, EBRs, or AAPs through NEWLDR.The MBR code passes additional information to the VBR in many implementations:
boot1h
,boot1u
, and David Elliott'sboot1fat32
) depend on this pointer as well, but additionally they don't use DS, but assume it to be set to0x0000 instead.[33] This will cause problems if this assumption is incorrect. The MBR code of OS/2, MS-DOS 2.0 to 8.0, PC DOS 2.0 to 7.10 and Windows NT/2000/XP provides this same interface as well, although these systems do not use it. The Windows Vista/7 MBRs no longer provide this DS:SI pointer. While some extensions only depend on the 16-byte partition table entry itself, other extensions may require the whole 4 (or 5 entry) partition table to be present as well.Under DR-DOS 7.07 an extended interface may be optionally provided by the extended MBR and in conjunction with LOADER:
In conjunction with GPT, anEnhanced Disk Drive Specification (EDD) 4Hybrid MBR proposal recommends another extension to the interface:[37]
!GPT
")$PnP
" installation check structure (see above)Though it is possible to manipulate thebytes in the MBR sector directly using variousdisk editors, there are tools to write fixed sets of functioning code to the MBR. Since MS-DOS 5.0, the programFDISK
has included the switch/MBR
, which will rewrite the MBR code.[38] UnderWindows 2000 andWindows XP, theRecovery Console can be used to write new MBR code to a storage device using itsfixmbr
command. UnderWindows Vista andWindows 7, theRecovery Environment can be used to write new MBR code using theBOOTREC /FIXMBR
command.Some third-party utilities may also be used for directly editing the contents of partition tables (without requiring any knowledge of hexadecimal or disk/sector editors), such as MBRWizard.[o]
dd
is a POSIX command commonly used to read or write any location on a storage device, MBR included. InLinux, ms-sys may be used to install a Windows MBR. TheGRUB andLILO projects have tools for writing code to the MBR sector, namelygrub-install
andlilo -mbr
. The GRUB Legacy interactive console can write to the MBR, using thesetup
andembed
commands, but GRUB2 currently requiresgrub-install
to be run from within an operating system.
Various programs are able to create a "backup" of both the primary partition table and the logical partitions in the extended partition.
Linuxsfdisk
(on aSystemRescueCD) is able to save a backup of the primary and extended partition table. It creates a file that can be read in a text editor, or this file can be used by sfdisk to restore the primary/extended partition table. An example command to back up the partition table issfdisk -d /dev/hda > hda.out
and to restore issfdisk /dev/hda < hda.out
. It is possible to copy the partition table from one disk to another this way, useful for setting up mirroring, but sfdisk executes the command without prompting/warnings usingsfdisk -d /dev/sda | sfdisk /dev/sdb
.[39]
55hex AAhex
, that is0x55 at offset0x01FE andAAhex
at offset0x01FF. Sincelittle-endian representation must be assumed in the context ofIBM PC compatible machines, this can be written as 16-bit wordAA55hex
in programs forx86 processors (note the swapped order), whereas it would have to be written as55AAhex
in programs for other CPU architectures using abig-endian representation. Since this has been mixed up numerous times in books and even in original Microsoft reference documents, this article uses the offset-based byte-wise on-disk representation to avoid any possible misinterpretation.00 00 00 00 00 00hex
unless the code stored in the MBR is known. Windows adheres to this rule.0000hex
:7C00hex
is the first byte of the 32nd KB of RAM. The loading of the boot program at this address historically was the reason why, while the minimum RAM size of an original IBM PC (type 5150) was 16 KB, 32 KB were required for the disk option in the IBM XT.A0000hex
or 655,360 bytes) of memory. In theory, only 32 KB (up to0000hex
:7FFFhex
) or 64 KB (up to0000hex
:FFFFhex
) are guaranteed to exist; this would be the case on an IBM XT-class machine equipped with only the required minimum amount of memory for a disk system.Every operating system includes tools to manage MBR partitions. Unfortunately, every operating system handles MBR partitions in a slightly different manner.
Matthias [R.] Paul writes: "[…]PTS-DOS [uses] a special fifth partition entry in front of the other four entries in the MBR and corresponding AAP-aware MBR bootstrap code. […]"
Some OEM systems, such as AST DOS (type(NB.NECMS-DOS 3.30 andAST MS-DOS partition tables with eight entries are preceded with a signature14hex
) and NEC DOS (type24hex
) had 8 instead of 4 partition entries in their MBR sectors. (Matthias R. Paul).
A55Ahex
at offset0x017C.)When we added partitions to this NEC table, the first one was placed at offsets0x01EE through0x01FD and the next entry was added just above it. So, the entries are inserted and listed backwards from that of a normal Table. Thus, looking at such a Table with a disk editor or partition listing utility, it would show the first entry in a NEC eight-entry table as being the last one (fourth entry) in a normal Partition Table.(NB. Shows an 8-entry partition table and where its boot code differs from MS-DOS 3.30.)
0x7C00
in x86?". Glamenv-Septzen.net.Archived from the original on 2017-08-24. Retrieved2011-05-04.[…] SYS […] /O[:nnn] Override IPL reported boot drive unit (n=0..126, 128..254). […] Preparing target disk... Choosing FAT12 CHS Boot Sector (requires IPL to report boot unit). Treating target as diskette or superfloppy medium (boot drive unit 0). Writing new Boot Sector... […](NB. SYS writesvolume boot records rather than master boot records, but their incoming register interface is similar (with extensions) since they could both be loaded initially by the underlying system.)