System Plików ISO9660

Julian Kania

Wstęp

System plików iso9660 został zaprojektowany w 1986 jako standard zapisu danych na dyskach optycznych. Jego tworzeniem zajęła się organizacja nie związana z żadną architekturą komputerów ani z żadnym systemem operacyjnym (por ISO - International Organization for Standarization). System plików iso9660 z zamierzania miał być łatwo obsługiwany przez wszystkie platformy.

Oczywiście zwolennicy poszczególnych systemów starali się wpływać na kształt tego systemu plików, stąd zawiera on wiele kompromisów oraz jest dość złożony jak na zadanie, jaki przed nim postawiono.

Różne wersje systemu plików ISO9660

Stworzenie międzyplatformowego, wspólnego dla różnych architektur systemu plików okazało się zadaniem na tyle trudnym, że powstało kilka odmian iso9660. Oto jak przedstawia się lista wersji iso9660:

Budowa

podstawowe założenia

sektor startowy

Sektory 0-15 są przeznaczone na informacje potrzebne do startowania systemu z cd. Gdy taka informacja jest niepotrzebna, są pozostawiane puste (wypełnione zerami).

deskryptory woluminu

Oto część kodu definiującego deskryptor woluminu:

typedef unsigned char Byte;
  typedef unsigned short Word;
  typedef unsigned long Long;

  typedef struct
   {
    Byte  VDType;                  /* koniecznie 1 dla pierwszego deskryptora */
    char  VSStdId[5];              /* koniecznie "CD001".                     */
    Byte  volumeFlags;             /* 0 dla pierwszego deskryptora            */
    char  systemIdentifier[32];    /* System przeznaczenia                    */
    char  volumeIdentifier[32];    /* Nazwa woluminu                          */
    Long  lsbVolumeSpaceSize;      /* Rozmiar woluminu, mały indianin         */
    Long  msbVolumeSpaceSize;      /* Rozmiar woluminu, duży indianin         */
    Word  msbVolumeSetSize;
    Word  lsbLogicalBlockSize;     /* Logiczny rozmiar bloku, obaj indianie   */
    Word  msbLogicalBlockSize;     /* jw, duży indianin                       */
    Long  lsbPathTableSize;        /* Ile bajtów ma tablica ścieżek           */
    Long  msbPathTableSize;
    Long  lsbPathTable1;           /* pierwszy sektor tablicy ścieżek         */
    Long  lsbPathTable2;           /* opcjonalnie, drugi sektor               */
    Long  msbPathTable1;   
    Long  msbPathTable2;   
    char  rootDirectoryRecord[34]; /* kopia katalogu głównego                 */
    char  volumeSetIdentifier[128];/* prawa autorski i pola kontrolne         */
    char  publisherIdentifier[128];
    char  dataPreparerIdentifier[128];
    char  applicationIdentifier[128];
    char  copyrightFileIdentifier[37];
    char  abstractFileIdentifier[37];
    char  bibliographicFileIdentifier[37];
    char  volumeCreation[17];
    char  volumeModification[17];
    char  volumeExpiration[17];
    char  volumeEffective[17];
    char  FileStructureStandardVersion;
    char  ApplicationUse[512];
    char  FutureStandardization[653];
  } PVD, *PVDPtr;

tablica ścieżek

Po deskryptorze woluminu następuję tablica ścieżek. dla każdego katalogu na cd znajduje się następujący wpis:

 typedef char  dirIDArray[8];
 typedef struct
   {
   byte  len_di;      /* długość nazwy katalogu, 1 dla katalogu głównego */
   byte  XARlength;   /* długość rekordu z rozszerzonymi atrybutami      */
   Long  dirLocation; /* pierwszy blok katalogu                          */
   Word  parentDN;    /* numer katalogu nadrzędnego                      */
   dirIDArray dirID;  /* nazwa katalogu                                  */
 } PathTableRecord, PathTableRecordPtr;

cechy

katalogi w tablicy ścieżek są umieszczone wg. następującej zasady:

katalogi

Katalog zawiera listę swojej zawartości, posortowaną alfabetycznie po nazwach. Oto wpis do listy zawartości katalogu:

 typedef struct
   {
   char  signature[2];     /* $41 $41 - 'AA' famous value.               */
   byte  extensionLength;  /* $0E for this ID.                           */
   byte  systemUseID;      /* 02 = HFS.                                  */
   byte  fileType[4];      /* Such as 'TEXT' or 'STAK'.                  */
   byte  fileCreator[4];   /* Such as 'hscd' or 'WILD'.                  */
   byte  finderFlags[2];
   } AppleExtension;

   typedef struct
   {
   byte  len_dr;           /* rozmiar rekordu katalogu                   */
   byte  XARlength;        /* rozmiar rekordu z rozszerzonymi atrybutami */
   Long  lsbStart;         /* pierwszy blok pliku                        */
   Long  msbStart;
   Long  lsbDataLength;    /* rozmiar pliku w bajtach                    */
   Long  msbDataLength;
   byte  year;             /* od 1900. */
   byte  month;
   byte  day;
   byte  hour;
   byte  minute;
   byte  second;
   byte  gmtOffset;        /* 15-minutowe przesunięcie od GMT            */
   byte  fileFlags;        /* atrybuty                                   */
   byte  interleaveSize;   /* Używane dla plików interleaved             */
   byte  interleaveSkip;   /* jw                                         */
   Word  lsbVolSetSeqNum;  /* który wolumin ze zbioru zawiera ten plik   */
   Word  msbVolSetSeqNum;
   byte  len_fi;           /* długość nazwy następnego pliku             */
   char  fi[37];           /* nazwa pliku                                */
   AppleExtension apple;   /* coś dla sadowników                         */
   } DirRcd, *DirRcdPtr; 

dane


Lokalne systemy plików