Removed remaining questions about MIPS Big Endian. Now rounding up the count
of cylinders. Described MBR DOS-style partition table format.
This commit is contained in:
parent
1ccbaa302c
commit
ef444fb29c
@ -251,6 +251,7 @@ Byte Range | Value | Meaning
|
|||||||
|
|
||||||
Sources:
|
Sources:
|
||||||
http://en.wikipedia.org/wiki/Master_boot_record
|
http://en.wikipedia.org/wiki/Master_boot_record
|
||||||
|
Mailing list conversations with H. Peter Anvin and Vladimir Serbinenko.
|
||||||
|
|
||||||
|
|
||||||
The candidates for MBR booting will normally use El Torito rather than MBR
|
The candidates for MBR booting will normally use El Torito rather than MBR
|
||||||
@ -259,9 +260,86 @@ The eventual MBR comes into effect it the image is on a media that is
|
|||||||
interpreted by the BIOS as some kind of hard disk. Usually real hard disks,
|
interpreted by the BIOS as some kind of hard disk. Usually real hard disks,
|
||||||
floppy disks, USB sticks, memory cards.
|
floppy disks, USB sticks, memory cards.
|
||||||
|
|
||||||
>>>
|
An important part of an MBR is the DOS style partition table. It describes up
|
||||||
|
to four primary partitions. There are two formats used for block address:
|
||||||
|
Cylinder/Head/Sector (C/H/S) and Logical Block Address (LBA). Both are based
|
||||||
|
on units of 512 bytes. So MBR_LBA = ISO_LBA * 4.
|
||||||
|
|
||||||
>>> iso_write_opts_set_part_offset()
|
For C/H/S, the sector address is broken up into whole cylinders, remaining
|
||||||
|
heads, and remaining sectors. The nomenclature seems to stem from antique
|
||||||
|
drum storage.
|
||||||
|
C/H/S counting starts with 0/0/1, not 0/0/0.
|
||||||
|
There are two parameters, sectors_per_head and heads_per_cylinder which are not
|
||||||
|
stored in the MBR. So it is more or less arbitray how to convert a LBA into
|
||||||
|
a C/H/S address and vice versa. For maximum range of C/H/S addresses one
|
||||||
|
may use sectors_per_head = 63 , heads_per_cylinder = 255.
|
||||||
|
|
||||||
|
|
||||||
|
Words are composed little-endian style.
|
||||||
|
|
||||||
|
Byte Range | Value | Meaning
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
0 - 439 | = opaque = | Code Area filled with bytes for some boot system,
|
||||||
|
| | typically machine code.
|
||||||
|
| |
|
||||||
|
440 - 443 | disk_sgntr | Disc signature, an individual disk id of obscure
|
||||||
|
| | usability.
|
||||||
|
| | (The Code Area might extend up to this field.)
|
||||||
|
| |
|
||||||
|
444 - 445 | 0 | "usually nulls"
|
||||||
|
| | (The Code Area might extend up to this field.)
|
||||||
|
| |
|
||||||
|
446 - 461 | ========== | Partition Table Entry for partition 1
|
||||||
|
| |
|
||||||
|
446 - 446 | status | Governs bootability:
|
||||||
|
| | 0x80 = bootable/active , 0x00 non-bootable/inactive
|
||||||
|
| |
|
||||||
|
447 - 449 | ========== | C/H/S address of partition start
|
||||||
|
447 - 447 | start_head | Heads part of start address.
|
||||||
|
448 - 448 | start_c_s | Bits 0 to 5 : Sectors part of start address.
|
||||||
|
| | Bits 6 to 7 : Bits 8 to 9 of cylinders part.
|
||||||
|
449 - 449 | start_cyl | Lower 8 bits of cylinders part of start address
|
||||||
|
| |
|
||||||
|
450 - 450 | part_type | Partition type indicates the purpose or kind of
|
||||||
|
| | filesystem in the partition.
|
||||||
|
| |
|
||||||
|
451 - 453 | ========== | C/H/S address of last absolute sector in partition
|
||||||
|
451 - 451 | end_head | Heads part of end address.
|
||||||
|
452 - 452 | end_c_s | Bits 0 to 5 : Sectors part of end address.
|
||||||
|
| | Bits 6 to 7 : Bits 8 to 9 of cylinders part.
|
||||||
|
453 - 453 | end_cyl | Lower 8 bits of cylinders part of end address
|
||||||
|
| |
|
||||||
|
454 - 457 | start_lba | LBA of first absolute sector in partiton.
|
||||||
|
| | Block size is 512. Counting starts at 0.
|
||||||
|
| |
|
||||||
|
458 - 461 | num_blocks | Number of sectors in partition.
|
||||||
|
| |
|
||||||
|
462 - 477 | ========== | Partition Table Entry for partition 2
|
||||||
|
| part_entr2 | 16 bytes. Format as with partition 1.
|
||||||
|
| | All 0 means that partition is unused/undefined.
|
||||||
|
| |
|
||||||
|
478 - 493 | ========== | Partition Table Entry for partition 3
|
||||||
|
| part_entr3 | 16 bytes. See above.
|
||||||
|
| |
|
||||||
|
494 - 509 | ========== | Partition Table Entry for partition 4
|
||||||
|
| part_entr4 | 16 bytes. See above.
|
||||||
|
| |
|
||||||
|
510 - 510 | 0x55 | MBR signature
|
||||||
|
511 - 511 | 0xaa | MBR signature
|
||||||
|
| |
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
By tradition the MBR itself and possibly more blocks are not claimed by any
|
||||||
|
partition. But starting the first partition at a non-zero block address causes
|
||||||
|
on Linux a partition device file (e.g. /dev/sdb1) which cannot be used to mount
|
||||||
|
the ISO filesystem.
|
||||||
|
|
||||||
|
libisofs is able to produce a second set of trees and meta data which is
|
||||||
|
suitable for being mounted at start block 16 (ISO) resp. 64 (MBR).
|
||||||
|
See <libisofs/libisofs.h> for call iso_write_opts_set_part_offset()
|
||||||
|
and http://libburnia-project.org/wiki/PartitionOffset for examples with
|
||||||
|
program xorriso.
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
@ -274,7 +352,7 @@ Sources:
|
|||||||
Mailing list conversations with hpa.
|
Mailing list conversations with hpa.
|
||||||
|
|
||||||
|
|
||||||
An isohybrid MBR directs the booting BIOS to an Isolinux boot image which
|
An isohybrid MBR directs the booting BIOS to an ISOLINUX boot image which
|
||||||
is also the target of an El Torito boot catalog entry.
|
is also the target of an El Torito boot catalog entry.
|
||||||
For that purpose one has to take an MBR template and has to set a few bytes
|
For that purpose one has to take an MBR template and has to set a few bytes
|
||||||
to values which sufficiently describe the ISO image and the boot image file.
|
to values which sufficiently describe the ISO image and the boot image file.
|
||||||
@ -284,14 +362,18 @@ Words are composed little-endian style.
|
|||||||
Byte Range | Value | Meaning
|
Byte Range | Value | Meaning
|
||||||
---------- | ---------- | ----------------------------------------------------
|
---------- | ---------- | ----------------------------------------------------
|
||||||
0 - 431 | = opaque = | Syslinux machine code provided by MBR template
|
0 - 431 | = opaque = | Syslinux machine code provided by MBR template
|
||||||
|
| |
|
||||||
432 - 439 | hd_bootlba | Address of the ISOLINUX boot image file in the
|
432 - 439 | hd_bootlba | Address of the ISOLINUX boot image file in the
|
||||||
| | ISO image. Counted in 512 byte blocks.
|
| | ISO image. Counted in 512 byte blocks.
|
||||||
|
| |
|
||||||
440 - 443 | mbr_id | Random number
|
440 - 443 | mbr_id | Random number
|
||||||
444 - 445 | 0 | Padding
|
444 - 445 | 0 | Padding
|
||||||
| |
|
| |
|
||||||
446 - 509 | ========== | Partition table
|
446 - 509 | ========== | Partition table
|
||||||
| |
|
| |
|
||||||
446 - 461 | part_entry | Partition table entry 1 describing ISO image size
|
446 - 461 | part_entry | Partition table entry 1 describing ISO image size
|
||||||
|
| | starting at LBA 0. I.e. contrary to tradition.
|
||||||
|
| | See above for partition table entry format.
|
||||||
| |
|
| |
|
||||||
462 - 509 | 0 | Unused partition entries 2 to 4
|
462 - 509 | 0 | Unused partition entries 2 to 4
|
||||||
510 - 511 | 0xaa55 | MBR signature
|
510 - 511 | 0xaa55 | MBR signature
|
||||||
@ -331,6 +413,7 @@ Byte Range | Value | Meaning
|
|||||||
446 - 461 | part_entry | Partition table entry 1 describing ISO image size
|
446 - 461 | part_entry | Partition table entry 1 describing ISO image size
|
||||||
| | Peculiar is the start offset of 1 block.
|
| | Peculiar is the start offset of 1 block.
|
||||||
| | This prevents mounting of the partition.
|
| | This prevents mounting of the partition.
|
||||||
|
| | See above for partition table entry format.
|
||||||
| |
|
| |
|
||||||
462 - 509 | 0 | Unused partition entries 2 to 4
|
462 - 509 | 0 | Unused partition entries 2 to 4
|
||||||
510 - 511 | 0xaa55 | MBR signature
|
510 - 511 | 0xaa55 | MBR signature
|
||||||
|
@ -277,8 +277,7 @@ static int make_mips_volume_header(Ecma119Image *t, uint8_t *buf, int flag)
|
|||||||
iso_msb(buf, 0x0be5a941, 4);
|
iso_msb(buf, 0x0be5a941, 4);
|
||||||
|
|
||||||
/* 28 - 29 | num_cyl_l | Number of usable cylinder, lower two bytes */
|
/* 28 - 29 | num_cyl_l | Number of usable cylinder, lower two bytes */
|
||||||
/* >>> Shall i rather orund up ? */
|
num_cyl = (image_size + (bps * spt) - 1) / (bps * spt);
|
||||||
num_cyl = image_size / (bps * spt);
|
|
||||||
iso_msb(buf + 28, num_cyl & 0xffff, 2);
|
iso_msb(buf + 28, num_cyl & 0xffff, 2);
|
||||||
|
|
||||||
/* 32 - 33 | 1 | Number of tracks per cylinder */
|
/* 32 - 33 | 1 | Number of tracks per cylinder */
|
||||||
@ -361,7 +360,7 @@ static int make_mips_volume_header(Ecma119Image *t, uint8_t *buf, int flag)
|
|||||||
stream = iso_file_get_stream((IsoFile *) node);
|
stream = iso_file_get_stream((IsoFile *) node);
|
||||||
file_size = iso_stream_get_size(stream);
|
file_size = iso_stream_get_size(stream);
|
||||||
|
|
||||||
/* >>> shall i really round up to 2048 ? */
|
/* Shall i really round up to 2048 ? Steve says yes.*/
|
||||||
iso_msb(buf + (72 + 16 * idx) + 12,
|
iso_msb(buf + (72 + 16 * idx) + 12,
|
||||||
((file_size + 2047) / 2048 ) * 2048, 4);
|
((file_size + 2047) / 2048 ) * 2048, 4);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user