Partition Table: Difference between revisions

[unchecked revision][unchecked revision]
Content deleted Content added
m →‎MBR: make LBA a link to the page.
 
(17 intermediate revisions by 11 users not shown)
Line 2:
 
==MBR==
{{Main|MBR (x86)}}
The Master Boot Record is the traditional way of storing partition information about a hard disk, along with some boot code.
That is, the Partition Table is contained inside the [[MBR (x86)|MBR]], which is stored in the first sector
(cylinder 0, head 0, sector 1 -- or, alternately, [[LBA]] 0) of the hard drive.
(See the [[MBR (x86)|MBR article]] for the overall structure and contents of the MBR.)
 
Almost all PCs still use an MBR for booting hard disks, and for storing partition information on hard disks.
Traditional MBRs are nearly '''obsolete''' at this time, because the 32 bit design of the LBA fields in the Partition Table begins
to "overflow" when dealing with disks larger than 2Tb.
OneThe possiblesuccessor replacement forto the MBR system is [[GPT]] (see below). It might also be possible toThere agreewere onother aproposed new standardstandards for
the MBR, but the GPT won the battle.
the MBR, with 48 bit LBA fields for the partitions ([[#"Unofficial" 48 bit LBA Proposed MBR Format|see below]]).
 
Information about primary partitions and an extended partition is contained in a 64-byte data structure located in the MBR.
Line 43 ⟶ 44:
 
{| {{wikitable}}
! Offset
! Element (offset)
! Size
! Description
|-
| 00x00
| 1 byte
| Boot indicator bit flag: 0 = no, 0x80 = bootable (or "active")
|-
| 10x01
| 1 byte
| Starting head
|-
| 20x02
| 6 bits
| Starting sector (Bits 6-7 are the upper two bits for the Starting Cylinder field.)
|-
| 30x03
| 10 bits
| Starting Cylinder
|-
| 40x04
| 1 byte
| System ID
|-
| 50x05
| 1 byte
| Ending Head
|-
| 60x06
| 6 bits
| Ending Sector (Bits 6-7 are the upper two bits for the ending cylinder field)
|-
| 70x07
| 10 bits
| Ending Cylinder
|-
| 80x08
| dword4 bytes
| Relative Sector (to start of partition -- also equals the partition's starting LBA value)
|-
| 120x0C
| dword4 bytes
| Total Sectors in partition
|}
Line 92 ⟶ 93:
* At most one partition should be active.
* The Partition Table entries are <b>not</b> aligned on 4 byte boundaries (if the MBR is itself loaded into memory on a 4 byte boundary).
* Therefore, neither are the two dworduint32_t LBA entry values -- so the LBA values cannot be copied directly into a register.
* All the entry values are encoded little-endian. Take note of this if fetching the uint32_t LBA entry values two bytes at a time, even on little-endian systems.
* The Cylinder, Head, Sector fields (taken together) are only 3 bytes (24 bits) long.
* Sector values (in the CHS fields) of 0 are illegal.
Line 105 ⟶ 107:
The System ID byte is supposed to indicate what filesystem is contained on the partition (ie. Ext2, ReiserFS, FAT32, NTFS, ...).
There was never any standard created for the System ID byte -- which means that Microsoft went and tried to hog almost all of the possible values.
See [[#External Links|the links below]] for tables of values of the System ID byte, for filesystems that have been lucky enough to aquireacquire their own value by common consensus.
 
If you create your own custom filesystem, then you can simply pick a System ID value for your filesystem that seems to be unused.
There is also an attempt to standardize the use of System ID value = 0x7f (by the Alt-OS gang), to cover all custom filesystems that follow the standard -- however, their effort seems to be losing steam.
 
=="Unofficial" 48 bit LBA Proposed MBR Format==
The two CHS fields are unused in all current drives, leaving only the two 32 bit LBA fields to "do all the work". But there never was any 32 bit
LBA addressing mode -- the current "standard" LBA addressing mode is 48 bits. So it is reasonable to try to redefine the Partition Table to eliminate the
unused CHS fields, and use the extra space to extend the two LBA fields to a full 48 bit size. This would eliminate the impending obsolescence
of the entire MBR scheme.
 
It seems reasonable to try to preserve (as much as possible) the current Partition Table structure. Therefore, the following alternate
structure for 48 bit LBA Partition Table entries is proposed:
 
{| {{wikitable}}
! Element (offset)
! Size
! Description
|-
| 0
| byte
| Bitflags field: 1 = not bootable, 0x81 = bootable (or "active")
|-
| 1
| byte
| Signature-1 (0x14)
|-
| 2
| word
| Partition Start LBA (high word of 48 bit value)
|-
| 4
| byte
| System ID
|-
| 5
| byte
| Signature-2 (0xeb)
|-
| 6
| word
| Partition Length (high word of 48 bit value)
|-
| 8
| dword
| Partition Start LBA (low dword)
|-
| 12
| dword
| Partition Length (low dword)
|}
 
Note: The basic intent is to use bit #0 (value = 1) in the bitflags field as a "48 bit LBA" indicator, preserve the offsets and functions
of the bitflags and System ID fields, and use the two available aligned words to extend the LBA fields.
When detecting a valid partition entry, a little extra verification turns out to be useful, so the "extra" bytes in the table entry should be loaded with signature values.
 
==Extended Partitions==
 
Extended partitions are verya simple.way However,of theiradding definitionmore isthan very4 messed up, so it is easypartitions to make mistakes whena implementingpartition themtable.
 
The partition table may have one and only one entry that has the SystemID 0x5 (or 0xF). This describes an extended partition.
Extended partitions are nested. That is, in the Partition Table of your MBR you are allowed to have one (and only one) partition marked as being "extended". Otherwise, the extended partition entry has exactly the same format as all the other partition table entries.
 
An extended partition is one physical partition that is subpartitioned into "logical" partitions. So, the partition table entry describing it has a StartLBA and NumSectors that describe the space inside which any number of logical partitions may sit.
To mark a partition as extended, set the "System ID" AKA "type" byte to 0xf (or 5). 0xf is probably safer than 5 -- "Using type 05 for extended partitions beyond 8 GB may lead to data corruption with MSDOS." However, more OSes may recognize 5 than 0xf, and mount the partition properly.
 
WithinAt eachthe start of an extended partition, theis firstan sectorextended containspartition atable. fakeThis MBRtakes withexactly the same form as a fakenormal partition table., Theapart entirefrom fakemost MBRof isthe blank,fields exceptare forunused. twoOnly entriestwo inof the partition tableentries are used - (the first two)one describes the desired logical partition, plusand the 0xAA55second signature.one is a link (No,much therelike isn'ta anylinked goodlist) reasonthat whypoints allat thisanother spaceextended ispartition wastedtable. The peoplesize whoshould createdofficially thisinclude standardthe werelogical justpartition idiotsthat follows with it. The remaining two entries are not used and should be left zeroed out.)
 
TheNote twothat fakethe StartLBA fields in these extended partition table entries mayare containrelative oneto "logicalthe partition"start andof another nestedthe extended partition itself.
 
The "bitflags" and "System ID" bytes of the logical partition are used as normal. The partition <b>can</b> be bootable.
 
The CHS fields in the two fake partition table entries are undefined, and unused in the standard definition. (Note: This makes it convenient to use the CHS fields for the LBA48 high words, [[#"Unofficial" 48 bit LBA Proposed MBR Format|as suggested above]].)
 
The "Partition length" dwords in each of the two fake partition table entries are used normally.
 
Which brings up the biggest confusing thing about extended partitions: the "StartLBA" values in the fake partition tables. The values are "relative LBA"s -- not absolute LBAs, such as the ones in a normal partition table. Even worse: the two StartLBA values of the two fake partition table entries are <b>relative to two different things.</b> The StartLBA value of the logical partition is a relative offset from the beginning of the current extended partition (ie. the LBA that contains the current fake MBR and fake partition table). But the StartLBA of the <b>next</b> nested extended partition is relative to the beginning of the <b>previous</b> extended partition. (Note: of course the "previous" extended partition does not apply to the very first extended partition -- for the first extended partition, both StartLBAs are relative to the same point.)
 
Specifically, if you are parsing the fake partition table of the third extended partition, the logical partition entry's StartLBA will be a relative offset from the current LBA. The StartLBA entry for the nested <b>fourth</b> extended partition will be relative to the beginning of the <b>second</b> extended partition.
 
== GPT ==
{{Main|GPT}}
 
GPT is an updated Partition Table standard, that has been adopted as the recommended partition mechanism under [[UEFI]]. It does not contain the artificial 24 bit or 32 bit limitations of the MBR Partition Tables. It also contains enhancements to the concept of partition tables, in general, and is significantly more complex than the MBR scheme.
 
 
==See Also==
[[GPT]]
 
===External Links===