Traditionally, hard drives were accessed by cylinder, head, and sector (CHS), which represented the actual layout of data on the drive. Modern IDE/ATA drives have varying numbers of sectors per track, and individual sectors are naturally accessed with a simple count starting from 0 for the first sector. In order to provide backward compatibility, these drives can also be accessed by a simulated CHS, with translation into absolute sector numbers inside the drive. This internal drive translation can be changed using tools such as HD-MBOOT and examined with tools such as IDEATA.
Note that the lower limit (ie the first sector) for Cylinder,Head,Sector is 0,0,1. Everything is base zero EXCEPT the sector number.
The last physical cylinder on the drive used to be reserved for IBM disk diagnostics, but this is probably no longer an issue.
Unfortunately, the maximum count for Cylinder,Head,Sector is 1024,256,63 in the BIOS interface, but 65536,16,256 in the IDE/ATA interface. Thus, without further translation, we would be limited to the lowest common denominator 1024,16,63 which, with the sector size 512 bytes, gives a maximum disk size of 504Mb. To get around this, a modern BIOS translates the CHS from the drive by doubling the head count and halving the cylinder count until the cylinder count falls to 1024.
Again unfortunately, it turns out that DOS cannot cope with a head count of 256, so for drives over 4Gb, the head count needs to be translated to 255 rather than 256 by the BIOS. This gives an upper limit of 8Gb for the drive size.
A drive larger than 8Gb returns its C,H,S information as 16383,16,63; this is an indication that the CHS size information is wrong.
The region of a large drive beyond the 8Gb limit can only be accessed via the absolute (LBA) sector number. The first sector is number 0. Operating systems such as Windows NT4 Service Pack 4 and Linux can directly access the IDE/ATA drive in this way, but Windows 95 and Windows 98 rely on special INT 13 extensions in the BIOS and cannot go beyond the 8Gb limit without a suitable BIOS.
+--------------------------------+ | | | | /\/ code /\/ | | | +-----| | | | +--------------------------------+ |table 1 | table 2 | | +--------------------------------+ |table 3 | table 4 |55|aa| +--------------------------------+ figure 1 - MBRA Partition Table is a list of Partition start and end locations in cylinder, head, sector (CHS) format, the start location as an absolute sector, and a size in number of sectors; as well as partition type and whether or not the partition is bootable.
The CHS entries are in BIOS INT 13h format, with the cylinder number sharing some bits of the sector byte. The CHS values are used to interface with the BIOS which uses CPU registers for system calls.
BYTES 0 1 - 3 4 5 - 7 8 - 11 12 - 15 +----------------------------------------------------------+ | | | | | | | | BOOT | START-CHS | TYPE | END-CHS | ABS-START | NUM-SECS | | | | | | | | +----------------------------------------------------------+ Figure 2 - Partition TableThe CHS format is:
+-----------------+-----------------+-----------------+ | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | +-----------------+-----------------+-----------------+ | H H H H H H H H | C C S S S S S S | C C C C C C C C | +-----------------+-----------------+-----------------+ | DH | CL |CH | +-----------------+-----------------+-----------------+ Figure 3 - CHS Formatwhere the first line is the BYTE/BIT numbers, the second line shows data (C = cylinder, H = head, S = sector), and the last line shows which CPU register is loaded with the data by a BIOS call. The two cylinder bits in CL are the high order bits, so we get
The ABS-START and NUM-SECS are each four-byte little-endian counts,
Unused partition tables should be set to all zeros, although it is often sufficient to set the TYPE to 0.
The BOOT byte should be set to 0x80 for the (only) bootable partition and to 0 in all other cases.
If the starting or ending sector is beyond the CHS limit, it should be set to CHS=1023,255,63 to show it invalid.
There can only be one FAT file system in the MBR. If you need more, or need more than four partitions in total, you need to use a DOS EXTended partition (type 05).
Partitions normally start at a cylinder boundary: C,H,S=??,0,1. The first partition in the MBR and the (only) partition in a DOS EXTended partition normally start one head in, at C,H,S=??,1,1.
The first sector of a DOS EXTended partition is laid out similarly to the MBR, except that there may only be two Partition Tables: one for a "real" partition and optionally one for another, chained, DOS EXT partition. Each DOS EXT partition contains its own "real" partition and all the chained partitions, and should be sized acordingly.
Partition Fdisk Starting in Type Reports Size FAT Type version --------------------------------------------------------------------- 01 PRI DOS 0-15 MB 12-Bit MS-DOS 2.0 04 PRI DOS 16-32 MB 16-Bit MS-DOS 3.0 05 EXT DOS 0-2 GB n/a MS-DOS 3.3 06 PRI DOS 32 MB-2 GB 16-bit MS-DOS 4.0 07 ---- Windows NT NTFS [if Boot partition then < 4Gb] ---- 0E PRI DOS 32 MB-2 GB 16-bit Windows 95 * 0F EXT DOS 0-2 GB n/a Windows 95 * 0B PRI DOS 512 MB - 2 terabytes 32-bit OSR2 * 0C EXT DOS 512 MB - 2 terabytes 32-bit OSR2 * 82 ---------------- Linux Swap ------------------------ 83 ---------------- Linux EXT2 (native) --------------- [in part from Microsoft KB article Q69912] * Types 0C..0F Use the ABS-START and NUM-SECS fields and thus can extend beyond the 8Gb boundary.
The standard bootstrap uses the START-CHS field only, so boot partitions must start in the first 8Gb.
The active partition will then have its own bootstrap in its first sector; the Microsoft one is inserted by the FORMAT command. This bootstrap sector must also finish with the magic number AA55h (little endian, ie the bytes 55 AA. All bootstraps (MBR and partition) are executed at address 0000:7c00, but typically relocate themselves.
Denis A Nicole