2007年05月21日

ISO9660 その3 ボリュームの要素とファイルへのアクセス

ISO9660 のボリュームは、次の要素で構成されます。

システムエリア(先頭16論理セクタ)
データエリア
 ボリューム記述子群(PVD、SVD、EVD、VDTなど)
 パステーブル
 ディレクトリ(ディレクトリ内の子ディレクトリ情報とファイル情報の列)
 ファイル本体

システムエリアは、ボリューム(トラックのIndex01)の先頭から 0〜15 論理セクタのことで、普通全てゼロです。

残りがデータエリアです。データエリアは論理ブロックで構成され、数えます。

 ファイル本体のデータを読み出すには、16 論理セクタ目にあるボリューム記述子群から始めます。ここにルートディレクトリの情報も書いてあります。そこからディレクトリを階層順に辿ってゆくわけです。

ボリューム記述子群→ルートディレクトリ→子ディレクトリ→ファイル本体

この順序です。
もう少し詳しく書くと、

先頭から16セクタ目より始まるボリューム記述子群
 →ボリューム記述子群内の PVD または SVD または EVD
  →PVD / SVD / EVD 内のルートディレクトリの情報
→ルートディレクトリ
 →ルートディレクトリ内の目的の子ディレクトリの情報
→子ディレクトリ
 →子ディレクトリ内の目的の孫ディレクトリの情報

→ディレクトリ
 →ディレクトリ内の目的のファイルの情報
→ファイル本体

もう一つ、パステーブルを経由する方法があります。パステーブルからは全てのディレクトリの情報が入っています。

ボリューム記述子群→パステーブル→ディレクトリ→ファイル

もう少し詳しく書くと、

先頭から16セクタ目より始まるボリューム記述子群
 →ボリューム記述子群内の PVD または SVD または EVD
  →PVD / SVD / EVD 内のパステーブルの情報
→パステーブル
 →パステーブル内の目的のディレクトリの情報
→ディレクトリ
 →ディレクトリ内の目的のファイルの情報
→ファイル本体

となり、ディレクトリの階層を順次辿ってゆく必要がありません。

なお、ファイルの一覧を取得したり検索するだけならば、ファイル本体までアクセスする必要はありません。各ディレクトリ内のファイル情報を読み取るだけで十分です。


パステーブル、ディレクトリ、ファイル、は、論理ブロックの最初のバイトから始まります。大抵、パステーブルとファイルでは、それが論理ブロックの大きさより大きい場合、そのまま次の論理ブロックに続きます。ディレクトリでは、一つのディレクトリレコードが論理ブロックを跨がないよう、足りない場合は余った部分に 0x00 を入れ、次の論理ブロックからディレクトリレコードを記述しなおします。いずれも、最後の論理ブロックの終わりのほうが余った場合、0x00 で埋めます。


シンプルな CD-ROM では、
ボリューム記述子群
パステーブル
ディレクトリ群
ファイル群
の順で記録されています。ディレクトリはパステーブルのルールに従って並べられており、ディレクトリ内のディレクトリレコードは識別子(名前)コード順に並べられます。多くの場合、ファイル本体もまたこれらのルールに倣って並べられています。
ですがパステーブルとディレクトリとファイルの位置に厳密なルールが存在するわけではありません。ディレクトリとファイルがごっちゃ(フルパス名でのソートや、OS上のファイルを再帰を使って検索したそのままの順序)になっている場合もあります。ファイルを先に記録し、後ろにパステーブルとディレクトリ群を置く人もいます。PVD と SVD が並存したり、UDF Bridge のように他のシステムと共存させている場合にはより複雑です。

posted by 七癖 at 07:23| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月19日

ISO9660 その2 物理セクタ、論理セクタ、論理ブロック

CD-ROM などにアクセスするときは、バイト単位で読み書きするのではなく、それをまとめたセクタ単位で読み書きします。先頭からの位置もセクタで指定します。

そこでややこしいのが、物理セクタ、論理セクタ、論理ブロック、の違いです。

物理セクタは、メディア内の区切りであり、ユーザー用の実データ以外に同期信号やアドレス、CRC などの検査、復号用データを含みます。そして物理アドレスで場所を指定します。但し、ユーザーデータ以外は CD-R/W に Raw モードで書き込む時くらいしか気にする必要はありません。読み取るときにはドライブ(もしくはOS)が復号までやってくれます。

ISO9660 の論理セクタのバイト数は 2048 かそれ以上の 2 の n 乗です。物理セクタ内のユーザーデータの大きさが 2048 バイト未満であれば、論理セクタは 2048 バイトで、足りない分は次の物理セクタに続きます。物理セクタ内の実データ部が 2048 以上であれば、1 論理セクタは 1 物理セクタに収まるように n を最大に設定します。一つの論理セクタは必ず物理セクタのユーザーデータの先頭から始まります。

論理ブロックのバイト数は 512 かそれ以上の 2 の n 乗です。論理ブロックのバイト数は論理セクタのバイト数以下です。そのサイズは PVD/SVD/EVD に書かれています。

ただ、通常は物理セクタ内のユーザーデータ=論理セクタ=論理ブロック=2048 バイトでして、この違いを気にすることはあまりありません。

アドレスに相当する、先頭からの位置を論理ブロックで数えたものを論理ブロック番号 (LBN) と呼びます。
posted by 七癖 at 09:08| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月17日

ISO9660 その1 導入

ディスクには、ファイルの本体以外にファイルの名前、時刻やディスク上の位置と大きさ、フォルダ構造上のファイルの位置などが書かれています。その読み方、もしくは書き込む仕様を決めている規格の一つがISO9660です。

ISO9660 は、CD-ROM 用の国際規格です。DVD-ROM でも使われていることがよくあります。

ISO9660 は、読み取り専用の規格です。追記、上書きなどは考えられていません。空き領域の情報なんてものは始めからありません。そのかわり、データを速く読み取れるよう簡単な構成になっています。これは、ディスクの物理的な読み取り速度がそれほど速くないためでもあります。

こういった規格の例にもれず、ISO9660 もまた私達が半ば惰性で使用している数々の用語や数の表し方をきちんと定義し、文中で統一しています。
ビットとバイト、10進法と16進法表記、ファイル、アドレス、などです。

このブログでは、なるべく Windows 用 C++ 言語での表記に直します。

他、気になる用語や表記法については次回以降に説明します。

(にしても、こういった当たり前のことを文章にすると小難しくてわかりにくいのは何故だろう…。)
posted by 七癖 at 09:28| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月15日

ファイルシステムの話を始める前に

これからしばらく、ブログに何を書こうか迷っていたのですが、結局、CD-ROM や DVD-ROM のファイルシステムの話を少ししようと思います。

まず ISO9660 から始めようと思います。その後 joliet そして UDF1.02 と続ける予定です。

とはいえ、JIS の仕様書は高くて買っていません。これまで、日本語の解説サイトや他の方のソースコード、そして ROM イメージをいくつも見て理解していたのですが、もう少し正確を期すために、とりあえずここの ISO9660:1999 を Google 翻訳で訳してみました。が、いやあわからないこと。予備知識がある分、英文を眺めたほうがなんとなく理解できてしまいます。
というわけで、ここでの話は仕様の正確な訳ではありません、迷ったときには私がイメージを見てきた結果を書いてゆきます。あしからず。

また、ISO9660 の分割ファイルや関連ファイルは Windows 用 CD-ROM イメージばかり見ている為か全く見たことが無いので、説明しないか表だけ掲げて終わると思います。

参考文献(ISO9660編)

ECMA-119 http://www.ecma-international.org/publications/standards/Ecma-119.htm
公式。ISO9660:1980 と技術的に同一。

ISO9660:1999 http://www.y-adagio.com/public/standards/iso_cdromr/tocont.htm
今回の基礎資料。

ISO 9660 CD-ROMファイルシステムの概要 http://euc.jp/periphs/iso9660.ja.html
日本語訳はここから取得。
ここがあるから改めて書く必要はまあ無いのですが、私がプログラムを作っていてはまったことなどをそれとなく書き添えられればと思います。

オレンジフォーラム http://www.cds21solutions.org/osj/j/
ISO9660 ファイルシステム http://www.cds21solutions.org/osj/j/iso9660/index.html
導入には最適。

その他、多くの方の WebSite、ソースコード。

posted by 七癖 at 09:10| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。