Solaris/Linux/FreeBSDでCD-Rを焼こう |
YAMAMORI Takenori ●yamamori |
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のソースを覗いてみると面白いと思います.