●「ファイルアクセス関数はないんですか?」 筆者が編集部から聞いた話で,おもしろい(?)話があります.CQ RISC評価キットシリーズで次のような質問が多いそうです. 「RISCキットのコンパイラにはfopen()やfseek()などのファイルアクセス関数はないんですか?」 たぶん,PC上でしかプログラムを組んだことのない人なのでしょう.PC用にプログラムしたソースを,SHなどのRISCキットで動かしたいというところでしょうか. 残念ながら,RISC評価キットに添付されているCコンパイラには,ファイルアクセス関数は実装されていません.そのあたりの理由について,あらためて考えてみましょう. ● PC用コンパイラの場合 たとえば,MS-DOS用のコンパイラとして,LSI C-86試食版や,フリーで使えるようになったTurboCなどを考えてみます.これらMS-DOS版のCコンパイラは,ハードウェアはPC/AT,OSはMS-DOSという前提があるので,たとえばfopen()といった関数の呼び出しを,MS-DOSのINT 21hのファンクションコールに変換するライブラリと,ユーザープログラムをコンパイルしたオブジェクトとをいっしょにリンクして,実行形式ファイルを作成します. 実際の処理の流れの概要を図2に示します.ユーザープログラムがfopen()を呼び出すと,ライブラリを経由してINT 21hのファンクションコールが発行されます.MS-DOSはそれを受けて,ファイルアクセスをセクタアクセスに変換して,BIOSにセクタ単位のアクセスを指示します.BIOSは,指定されたドライブの指定されたセクタをアクセスするために,ハードウェアのI/Oをアクセスします.こうして実際のドライブが動き出します.BIOSはアクセスした結果をOSに返し,さらにOSはユーザープログラムに返します〔図2(a)〕.
PC/AT+MS-DOSという環境では,ハードウェア,BIOS,OSなど,それぞれの仕様や呼び出し手順などが決まっているので,それを前提にしてプログラムが組めるわけです.つまり,統一されたアーキテクチャが存在するので,それに対応した関数がコンパイラに標準で実装されている(できる)わけです〔図3(a)〕.
● 組み込み用コンパイラの場合 次に,組み込み機器での状況を考えてみます.組み込み機器はPCと違い,統一されたアーキテクチャがあるわけではありません.CPUすら別物である場合がほとんどです.また,同じCPUを載せていても,メモリやI/Oマップが異なれば,アーキテクチャが異なるシステムとなります. ハードウェアがそのような状況ですから,BIOSもそれぞれのハードウェアにあわせて独自に実装してあることが多いわけです. さらに組み込み機器のOSには,ITRONあり,VxWorksあり,最近では組み込みLinuxが流行なのでしょうか.もちろん,自社開発の独自OSということもあるでしょう.そして,場合によってはOSと呼べるものが存在しない場合すらあります〔図2(b)〕. このような状況では,とても「統一されたアーキテクチャ」どころの話ではありません.よって,一般的な組み込み機器用のコンパイラは,算術演算や文字列操作といったハードウェアに依存しない標準関数のみが用意され,ファイルアクセスなどのハードウェアに依存する関数は実装されていない(できない)のです〔図3(b)〕. ● ファイルシステムはコンパイラとは別に用意する 結局,組み込み機器では,コンパイラのライブラリに頼らずにファイルシステムを用意する必要があるわけです.その方法には,大きく分けて三つあると思います. MS-DOSは「ディスクオペレーティングシステム」という名前のとおり,ファイルシステムをもっています.組み込み機器向けのOSでは,タスク管理/スケジューリング機能しかもたない小規模なものから,本格的なマルチタスク/マルチスレッド/メモリ保護機能を有したもの,さらにはファイルシステムはもちろん,ネットワークプロトコルスタックまで標準で用意されている大規模なものまでさまざまです. ▼OSに標準で用意されている 大規模なOSはそれ相応の用途で使われます.つまりストレージやネットワークを標準的に使用するシステムを想定しているので,OSの機能としてはじめからファイルシステムなどの機能が用意されているのです. 逆にいうと,さまざまなソフトウェア部品が用意されており「必要な機能をすぐにOSに組み込むことができますよ」という点をセールスポイントにもしているわけです. ▼ミドルウェアとしてOSとは別に用意 ITRONに代表されるような小規模なOSでは,ミドルウェアとしてOSとは別個にファイルシステムを用意するのが一般的です.よって,場合によっては別メーカー製のものを組み合わせることになるので,組み合わせてうまく動くかどうか,そのあたりを十分に確認する必要があるでしょう. また,この種のミドルウェアには,とくにOSを必要とせずに単独で動くものなど,移植性の高いものがあります. ▼自社開発 もちろん,本特集の第4章の筆者のように,自分のところでファイルシステムを開発する方法もあるでしょう.その場合は,第1章から第3章のように,ファイルシステムに関する詳しい情報が必要になります. ● ファイルシステムの階層 もう一度,図2をみてください.ファイルシステムを構成するためには,いくつかの階層に分けて実装するのが一般的です. まず,ユーザーの作成するプログラムとの橋渡しを受け持つ,いわゆるAPI的な部分があります.そして,実際にディレクトリやリンクテーブルを解析して,どのファイルがどのクラスタに存在するか,クラスタチェーンをたどってファイル単位の読み書きを実現する,ファイルシステム本体の部分があります.一番下が,ファイルシステム本体から指示を受けて,セクタ単位でストレージを読み書きするドライバ部分です.一般にはこれら3階層で考えるのがよいでしょう. 独自仕様のハードウェア上にファイルシステムを実現する場合は,ハードウェアを直接制御するドライバ部分を,そのハードウェアに合わせて作成しなければなりません. これらの階層は,実際にはOSの規模やシステム構造によって,切り分け方は変わってくるでしょう.
● ファイルシステムの実装例 組み込み機器でも,比較的規模の大きなOSを採用したシステムでは,ファイルシステム本体はOSのカーネル内で動作し,ユーザープログラムとは完全に切り離されていることがあります.ファイルシステムの呼び出しも,そのシステムのアーキテクチャに合わせた特別な仕組みでカーネルモードに移行してから,ファイルシステム本体が呼び出されます.よって,通常の関数呼び出しのようにはいかないので,ユーザープログラムから通常関数のように呼び出せるライブラリを用意して,それをいっしょにリンクします〔図4(a)〕. 逆に小規模なシステムでは,メモリ保護やカーネルモードといった概念がありません.ファイルシステムもユーザープログラムもいっしょにコンパイル/リンクして,一つのメモリ空間上に配置して走らせます.ファイルシステムの呼び出しも,たんなる関数呼び出しと同じです〔図4(b)〕. まとめ PCでしかプログラムを組んだことのない人は,ファイルアクセスといった基本的な処理について,それがどのように実装されているかを深く考えることはないと思います.しかし,組み込み機器では,システムとしての要求仕様や使用環境,採用するCPUやプラットホームのアーキテクチャ,RTOS,ミドルウェアなどさまざまな要因で,ファイルシステムとしての機能や実装が異なるのです. すがわら・なおのぶ BIOS/ファームウェアプログラマ
7月号特集トップページへ戻る Copyright 2001 菅原尚伸 |