はじめに 組み込みシステムにおいて,なぜファイルシステムが必要になるのかは,おおむね次に示す2通りの理由が挙げられると思う. 第一に,他のシステムとのやり取りが必要な場合である.昨今では,どこにでもPCがあり,データ処理や保存には,PCの充実したソフトウェア群と安価なストレージを用いることが多い.RS-232-CやLAN,最近ならUSBやIEEE1394によるやり取りも一般的だが,フロッピーディスクやPCカードを用いたやり取りができると次のような利点がある. 1)事実上,あらゆるPC(PCカードはほとんどのノートPC)が備える基本的な装置である 2)ケーブルを必要としないため,装置とPCの設置場所に制限がない 3)持ち運びに便利である 容量的にもPCカード型あるいはコンパクトフラッシュ型のハードディスクがGバイトのオーダに達し,また(PC側にドライブを必要とするものの)フロッピーディスクサイズのMOも1.3Gバイトという大きさを達成している. この目的で利用されるファイルシステムの必要条件としては,なんといってもPCで読み書きできる形式であることだろう.専用ソフトを用いて読み書きすることも理論的には可能だが,ソフトのインストールが必要となると「あらゆるPCでも」という利点が失われることになる. 第二の必要性は,組み込みシステムそのもののためである.インターネットの普及にともない,組み込みOSにTCP/IPのプロトコルスタックが要求されるなど,OSそのものが大規模化,複雑化している.LinuxやBSDのようなUNIXをベースとした組み込みシステムも最近では普及しているようである. こうした場合,システム全体をオンメモリで実行するよりは,ディスク装置やフラッシュメモリを二次記憶として利用することが現実的である. 主記憶容量に余裕があれば,この目的に利用するファイルシステムには,二次記憶装置のスピードを最大限に引き出せるBSD ffsやジャーナリング/ロギングの技術を用いた複雑なものが望まれるが,現実には主記憶容量は限られていることが多い.この場合,単純な実装と高速な入出力とを秤にかけることになるだろう. どちらの目的にも候補に挙がるのは,Windowsの標準的なファイルシステムであるFATファイルシステムであろう.これは他のファイルシステムと比較して機能的にも性能的にもやや乏しいものはあるが,実装は単純であり,またPCとの互換性にも問題はなく,組み込みシステムではもっともよく使われるファイルシステムの一つといえる. ここでは,ファイルシステムを通じてPC/AT互換機とディスク/ファイルシステムを共有することを目的として,まずFATファイルシステムをはじめとする各種ファイルシステムが拠って立つところのディスク装置の基礎と,PC/AT互換機のパーティションテーブルについて説明する.なお,以下でいう「PC」は,ことわりのない場合はPC/AT互換機を示すこととする.
● ディスク装置の基本構造
図1は,ディスク装置の基本的な構造を示す.ディスク装置とは,その名のとおり円板上にディジタルデータを記憶する装置を指す.1枚のディスクは,上から見るとトラック(track)と呼ばれる同心円に分割される注1.各トラックは,外側から順に番号が振られ,これをトラック番号と呼ぶ. トラックは,さらにセクタ(sector)と呼ばれる円弧に分割される.フロッピーディスクなどでは,すべてのトラックが同数のセクタからなるが,すると内周のほうが外周に比べて密度が高くなってしまう.このため,容量を追求する最近のハードディスクやMOなどでは,外周のほうが多くのセクタからなる. 1セクタのサイズは固定で,PCで用いられるフロッピーディスクやハードディスクでは512バイト,以前広く使われていたNEC PC-9801シリーズのフロッピーディスクでは1024バイト,640Mバイト以上のMOなどでは2048バイトである. ちなみにハードディスクやMOなどのセクタサイズは,一般的にはハードウェアの仕様で固定されているが,フロッピーディスクの場合,こうした分割がフォーマット時に行われ,セクタサイズやトラック内のセクタ数などはある程度可変できる. セクタには,トラックごとにセクタ番号が振られる. ハードディスク装置などでは,一つの装置にこの円板を複数封入したものが多い注2.この円板はプラッタ(platter)と呼ばれるが,ディスク装置の外側から見た場合,プラッタより問題になるのはその面(サーフェス:surface)である.情報の記録は面上に行われるためである.プラッタの片面しか利用しない場合もある注3. 記録面にはサーフェス番号というべき番号が振られるが,一般に,情報の読み書きを行うヘッド(head)を面ごとに個別に持つドライブが多く,そのため通常はヘッド番号と呼ぶ.フロッピーディスクの場合,その両面を用いるため,ヘッド数(サーフェス数)は2 注4,ハードディスクの場合はモデルによって1〜十数,片面しか用いない3.5インチMOなどの場合は1である. 以上をまとめると,ディスク上の任意のバイト情報は,ヘッド番号,トラック番号,セクタ番号,セクタ内のバイト位置により表せる. さて,ヘッドはトラック間をステッピングモータにより移動し,またディスクの回転によってセクタ間を(相対的に)移動する.複数の面からなるディスクの場合,すべてのヘッドが同じステッピングモータで制御されることが多い.これは,トラック番号が同じセクタ間のヘッドの移動は,ステッピングモータの移動なしで行えることを示す.通常,トラック間の(ステッピング)移動は,セクタ間の(回転)移動に比べて1桁〜2桁遅いため,これは重要である. トラック番号が同じ,すなわちディスクを束ねたときに円筒状になる一連のトラックをまとめてシリンダ(cylinder)と呼び,トラック番号のことをシリンダ番号と呼ぶことが多い. ● PCにおけるCHS PCにおいてはシリンダ番号,ヘッド番号,セクタ番号(まとめてCHSと呼ぶ)によるアドレッシングはたいへん重要である.PCにおいては,伝統的にファームウェア(BIOS)を用いたディスクの読み書きに,CHS番号によるアドレッシングを用いており,後述するようにパーティション情報もCHSでもつ. 伝統的なATA(AT Attachment,俗にいうIDE)ディスクでは,シリンダ番号は10ビット,ヘッド番号は4ビット,セクタ番号は6ビットの計20ビットで表す.シリンダ番号とヘッド番号は0から始まるが,セクタ番号はなぜか1から始まる.これはATAというハードウェアの仕様注5の上限(16ビット/4ビット/8ビット)と,PC のBIOSのパラメータの上限(10ビット/8ビット/6ビット)のうち,それぞれ小さいほうの値による制限である.1024シリンダ,16ヘッド,63セクタというディスクがあった場合,このサイズは504Mバイトである(1Mを1024×1024で計算). ここで,ハードウェアとBIOSの二つの制限のうち,小さいほうを採用することによるむだを指摘することができる.504Mバイトの壁が現実となった1990年代半ば,BIOSがある種の変換を行うことで,BIOSの限界,すなわち10ビット+8ビット+6ビット=24ビットの空間をフルに利用できるようになった. 具体的には,シリンダ数をNで割り,ヘッド数に同じ数Nを掛けることにより,シリンダ数が1024以下になるような数Nを見付ける.ただし,Nは2のべき乗である.アドレッシングにも同じNを用いた乗算/除算を行う.変換されたシリンダ数/ヘッド数/セクタ数によるアドレッシングを行い,1024×256×63=16,515,072セクタ=約8Gバイトまでのディスクを扱えるようになった. ● 論理ブロック番号 さて,こうしていくつかの番号でアドレッシングされるディスク上のデータであるが,PCカード型のフラッシュメモリ(フラッシュATAカード)やコンパクトフラッシュなどの場合はこうした構造をもたない. また,たいていのハードディスクでは,各トラックが何セクタに分かれているか,などの情報が公開されていない.さらに,SCSIディスクではそもそも32ビットの通し番号(論理ブロック番号:Logical Block Address,略してLBA)でアドレッシングする注6.また,ATA仕様においても28ビットのLBAによるアドレッシングが規格化されている. 一方,CHSアドレッシングでは,前節で述べた変換をかけたとしても,8Gバイトしかアドレッシングできない.これがPCにおけるよく知られた「8Gバイトの壁」である.BIOSのほうも,現在ではLBAにより32ビット(ATAの場合ハードウェアの制限で28ビット)のアドレッシングが可能となっており,最近のPCとLBAアクセスをサポートした最近のOSの組み合わせでは8Gバイトの壁は存在しない. ● CHSとLBAの相互変換 ここまで,長々とPCにおける事情を解説してきた.実際に,これから組み込みシステムを設計する場合,デバイスドライバはこれらの事情を考慮する必要がある.おおざっぱにいえば,デバイスドライバはPCにおけるBIOSと似たような仕事をする必要があるといえるだろう.デバイスドライバを利用した入出力を行うファイルシステムは,LBAで統一したアクセスを行いたいところである. ▼フロッピーディスクの場合 フロッピーディスクコントローラは,通常CHSによるアドレッシングを要求する.LBAとCHSの変換は,次のように行える(すべて整数演算,小数点以下切り捨て). ▼CHS→ LBA LBA=(H+C×総ヘッド数)×トラックあたりセクタ数+S ▼LBA→CHS C=LBA/(トラックあたりセクタ数×総ヘッド数) H=(LBA/(トラックあたりセクタ数)) % 総ヘッド数 S=LBA % トラックあたりセクタ数+1 ▼ATAディスク(PCカードやCFカードを含む)の場合 LBAによるアクセスとCHSによるアクセスが共存する.古いディスクの場合,ドライブ自体がLBAによるアドレッシングを許さないことがある.この場合,デバイスドライバはフロッピーディスクと同じような変換をする必要がある.また,504Mバイトの壁を越えるために,BIOSによる変換をエミュレートする必要がある可能性もある.ディスクがLBAをサポートしていれば,そのままLBAが利用できる. なお,パーティション処理もデバイスドライバで行うと便利である.ファイルシステムの各種情報は,パーティション先頭からのオフセットで格納されるのが普通である.パーティションの認識については,次節で詳しく解説する. ▼SCSIディスクの場合 LBAによるアクセスがそのまま可能である.パーティションの処理に関する事情もATAと同じである. 注1:CD-ROMのように,らせん状に1本のトラックで構成されるものもある. 注2:現在主流のウィンチェスタ型ハードディスクの場合,原理上密閉する必要がある. 注3:典型的には複数枚のプラッタのうち,一番外側の2面は利用されないことがある. 注4:現在主流の3.5インチで,1.44Mバイトの容量をもつフロッピーディスクを2HDと呼ぶが,この最初の2が2面を指す. 注5:初めてANSIで規格化されたATA-2による. 注6:こうしたディスク(メモリカード)であっても,ダミーのシリンダ数/ヘッド数/セクタ数をもつ.そもそもPCMCIA規格は,ソフトウェアから見る限りATAディスクに近くなるように仕様が設計されている.たとえば,筆者の手元の30MバイトのCFカードは,306シリンダ/6ヘッド/32セクタのディスクとして認識された.
7月号特集トップページへ戻る Copyright 2001 みのうら・まこと |