ISO 9660

From OSDev.wiki
Revision as of 14:37, 25 August 2009 by osdev>Aj (Fixed date and time table formatting.)
Jump to navigation Jump to search
Filesystems
Virtual Filesystems

VFS

Disk Filesystems
CD/DVD Filesystems
Network Filesystems
Flash Filesystems

ISO 9660 is the standard filesystem for CD-ROMs.

This page is a work in progress.
This page may thus be incomplete. Its content may be changed in the near future.

Overview and Caveats

ISO 9660 is not a complex file system, but has a few quirks that are worth remembering. It seems that some operating systems also create non-compliant CD's, so beware! The main example of this is the character set that is available for file names. Strictly, this consists of A-Z (upper case only!), digits and underscores. Many operating systems also allow lower case letters and other characters. Linux's VFS displays lower case filenames to the user despite the cd contents actually containing upper case characters.

Another quirk of the system is that it has several numbering formats and multi-byte numbers are often represented in "both-endian" format (that is, LSB first followed by MSB first). For this reason, 32 bit LBA's often appear in 8 byte fields.

It should be noted that an ISO 9660 sector is 2KiB (2048 bytes) long. The term "extent" is used to describe a sequential series of sectors.

Another (perhaps little-known and little-utilised) feature of the ISO 9660 file system is that a single file system can span multiple CD's. This is dealt with via "set numbers".

Volume Descriptors

When preparing to mount a CD, your first action will be reading the volume descriptors (specifically, you will be looking for the Primary Volume Descriptor).

Sectors 0x00-0x0F of the CD are reserved for system use. This means that the Volume Descriptors can be found starting at sector 0x10. The format of the volume descriptors is as follows:

Offset Length (bytes) Field Name Description
0 1 Type Volume Descriptor type code (see below).
1 5 Identifier Always 'CD001'.
6 1 Version Volume Descriptor Version (0x01).
7 2041 Data Depends on the volume descriptor type.

This means that each volume descriptor is therefore one sector (2KiB) long.

Volume Descriptor Type Codes

Value Description
0 Volume descriptor is a Boot Record
1 Primary Volume Descriptor
2 Supplementary Volume Descriptor
3 Volume Partition Descriptor
4-254 Reserved
255 Volume Descriptor Set Terminator

When starting out with a basic CD, we are going to be interested in the Primary Volume Descriptor, which points us to the root directory and path tables, which both allow us to find any file on the CD. Using the path table is ideal for minimal implementations which do not wish to search the directory heirarchy node by node. This is slower (string comparisons across the entire filesystem) but easier to implement.

Note that the Volume Descriptor Set Terminator does not currently define bytes 7-2047 of its' Volume Descriptor. This means that the only fields in use for the volume set terminator are the type code (255, 0xFF), the standard identifier ('CD001') and the descriptor version (0x01).

The Boot Record

The first type of Volume Descriptor is the "Boot Record". The descriptor format is as follows:

Offset Length (bytes) Field Name Value Description
0 1 Type 0 Zero indicates a boot record.
1 5 Identifier 'CD001' Always 'CD001'.
6 1 Version 0x01 Volume Descriptor Version (0x01).
7 32 Boot System Identifier (string) ID of the system which can act on and boot the system from the boot record in a-characters.
39 32 Boot Identifier (string) Identification of the boot system defined in the rest of this descriptor in a-characters.
71 1977 Boot System Use Unspecified Custom - used by the boot system.

The Primary Volume Descriptor

This is a lengthy descriptor, but it contains some very useful information for reading the rest of the file system.

Offset Length (bytes) Field Name Description
0 1 Type Code Always 0x01 for a Primary Volume Descriptor.
1 5 Standard Identifier Always 'CD001'.
6 1 Version Always 0x01.
7 1 Unused Always 0x00.
8 32 System Identifier The name of the system that can act upon sectors 0x00-0x0F for the volume in a-characters.
40 32 Volume Identifier Identification of this volume in d-characters.
72 8 Unused Field
80 8 Volume Space Size Number of Logical Blocks in which the volume is recorded. This is a 32 bit value in both-endian format.
88 32 Unused Field
120 4 Volume Set Size The size of the set in this logical volume (number of disks). This is a 16 bit value in both-endian format.
124 4 Volume Sequence Number The number of this disk in the Volume Set. This is a 16 bit value in both-endian format.
128 4 Logical Block Size The size in bytes of a logical block in both-endian format. NB: This means that a logical block on a CD could be something other than 2KiB!
132 8 Path Table Size The size in bytes of the path table in 32 bit both-endian format.
140 4 Location of Type-L Path Table LBA location of the path table, recorded in LSB-first (little endian) format. The path table pointed to also contains LSB-first values.
144 4 Location of the Optional Type-L Path Table LBA location of the optional path table, recorded in LSB-first (little endian) format. The path table pointed to also contains LSB-first values. Zero means that no optional path table exists.
148 4 Location of Type-M Path Table LBA location of the path table, recorded in MSB-first (big-endian) format. The path table pointed to also contains MSB-first values.
152 4 Location of Optional Type-M Path Table LBA location of the optional path table, recorded in MSB-first (big-endian) format. The path table pointed to also contains MSB-first values.
156 34 Directory entry for the root directory. Note that this is not an LBA address, it is the actual Directory Record, which contains a zero-length Directory Identifier, hence the fixed 34 byte size.
190 128 Volume Set Identifier Identifier of the volume set of which this volume is a member in d-characters.
318 128 Publisher Identifier The volume publisher in a-characters. If unspecified, all bytes should be 0x20. For extended publisher information, the first byte should be 0x5F, followed by an 8.3 format file name. This file must be in the root directory and the filename is made from d-characters.
446 128 Data Preparer Identifier The identifier of the person(s) who prepared the data for this volume. Format as per Publisher Identifier.
574 128 Application Identifier Identifies how the data are recorded on this volume. Format as per Publisher Identifier.
702 38 Copyright File Identifier Identifies a file containing copyright information for this volume set. The file must be contained in the root directory and is in 8.3 format. If no such file is identified, the characters in this field are all set to 0x20.
740 36 Abstract File Identifier Identifies a file containing abstract information for this volume set in the same format as the Copyright File Identifier field.
776 37 Bibliographic File Identifier Identifies a file containing bibliographic information for this volume set. Format as per the other File Identifier fields.
813 17 Volume Creation Date and Time Date and Time format as specified below.
830 17 Volume Modification Date and Time Date and Time format as specified below.
847 17 Volume Expiration Date and Time Date and Time format as specified below. After this date and time, the volume should be considered obsolete. If unspecified, then the information is never considered obsolete.
847 17 Volume Effective Date and Time Date and Time format as specified below. Date and time from which the volume should be used. If unspecified, the volume may be used immediately.
881 1 File Structure Version An 8 bit number specifying the directory records and path table version (always 0x01).
882 1 Unused Always 0x00.
883 512 Application Used Contents not defined by ISO 9660.
1395 653 Reserved Reserved by ISO.


Date and Time Format

The date / time format used in the Primary Volume Descriptor is:

Offset Size Description
0 4 Year from 1 to 9999.
4 2 Month from 1 to 12.
6 2 Day from 1 to 31.
8 2 Hour from 0 to 23.
10 2 Minute from 0 to 59.
12 2 Second from 0 to 59.
14 2 Hundedths of a second from 0 to 99.
16 1 Offset from GMT in 15 minute intervals from -48 (West) to +52 (East)

All fields except for the offset from GMT are in ASCII digits. An unspecified date and time is represented by 16 '0' digits, followed by a zero in the last field.

See Also

Articles

  • El-Torito, a standard for creating bootable CD-ROMs

External links