Solaris/Linux/FreeBSDでCD-Rを焼こう

YAMAMORI Takenori ●yamamori
■コラム■「ちょっとハズシのISO9660データ構造」

ISO9660ファイルシステムは,さまざまなプラットフォームで不都合なく 使用できるようにするために,32bitや16bitのアドレスやオフセットの データについては,big-endian/little-endianの両方で書かれています. また,パステーブルについては,big-endian用,little-endian用と, 別々に2つのパステーブルを持っています. さらに,Joliet拡張された場合は,PVD/SVDの両方からそれぞれリンクした パステーブルが必要なため,CD-ROMには結局4つのパステーブルが 記録されていることになります.

しかし,せっかくendianの違いに気を配っていても, 実は何と,データが32bit/16bit境界にアラインされていないのです!

つまり,これらの4バイト/2バイトのデータを, C言語で(long *)(short *) で直接アクセスするとcore dumpするのです.

もっとも,x86や,M68kのCPUでは,奇数アドレスからでも (long *)(short *)で アクセスできますが,ワークステーションで主に使用されるSPARCやMIPSでは, これは不可能です.

このためISO9660関係のプログラムをスマートに書こうとすると, 結局(char *)で1バイトずつシフトしながら読むことになります. そうなると,もはやendianの違いは関係なくなり, わざわざbig-endian/little-endianの2重のデータを持っているという ムダな面のみが残ってしまいます. こう考えると,ISO9660も結構ハズシた仕様であることがわかります.

このあたりに興味があれば,Linuxのカーネルソースの /usr/src/linux/fs/isofs/ 以下, FreeBSDのカーネルソースの /usr/src/sys/isofs/cd9660/ 以下や, mkisofsのソースを覗いてみると面白いと思います.


To 『Solaris/Linux/FreeBSDでCD-Rを焼こう』index


このページは、技術評論社 SoftwareDesign 2000年6月号、『CD-R/CD-ROM完全ガイド』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori