第1回 OS-9000のファイルマネージャの概要



この文章は、OS-9000/80386(OS-9/x86)およびOS-9/PowerPCに対応しています。



OS-9000のファイルシステムは、次のような階層構造になっています。


IOManはOS-9000の全てのI/Oシステムコールを処理します。そして、ファイルシステ ム毎に固有な処理をファイルマネージャに委託します。ファイルマネージャは論理的 なファイルシステムの構造をすべて処理し、物理的に必要な入出力をデバイスドライ バに委託します。デバイスドライバは複数の階層を持つ場合があります(SCSIなど)。

OS-9000のファイルマネージャは、I/Oシステムコールと殆ど1対1に対応した16個 のサブルーチンで構成されます。ファイルマネージャのサブルーチンエントリの一 覧を次に示します。

OS-9000ファイルマネージャエントリ一覧
番号 エントリ名 対応するシステムコール 機能概要
1 Attach _os_attach() デバイスをアタッチする時に呼び出されます。初めてアタッチされる場合はパスディスクリプタオプションやドライブオプション領域を確保し内容を初期化します。そしてデバイスドライバのスタティックストレージを初期化して、デバイスドライバのInitエントリを呼び出します。既にアタッチされている場合は使用カウントを+1して終了します。
2 Chdir _os_chdir() カレントディレクトリを移動する際に呼び出されます。RBFのような階層ディレクトリをサポートするファイルマネージャでは、適切な処理をしてディレクトリを移動します。それ以外のファイルマネージャでは、戻り値E_UNKSVCでエラーリターンします。
3 Close _os_close ファイルがクローズされる際に呼び出されます。RBFのようなマルチファイルシステムでは、適切な処理をしてファイルをクローズします。デバイスドライバのSetstatエントリをSS_CLOSEで呼び出してパスがCloseされたことをデバイスドライバへ通知します。
4 Create _os_create() ファイルを作成する際に呼び出されます。RBFのようなマルチファイルシステムでは、適切な処理をしてファイルを作成します。デバイスドライバのSetstatエントリをSS_OPENで呼び出してパスがOpenされたことをデバイスドライバへ通知します。SCFのようなシングルファイルシステムでは通常Openと同じ処理をします。
5 Delete _os_delete() ファイルを削除する際に呼び出されます。RBFのようなマルチファイルシステムでは、適切な処理をしてファイルを削除します。SCFなどのシングルファイルシステム(?)では、戻り値E_UNKSVCでエラーリターンします。
6 Detach _os_detach デバイスをデタッチする時に呼び出されます。使用カウントを-1し、0になったらパスディスクリプタオプションやドライブオプション領域を解放し、デバイスドライバのTerminateエントリを呼び出します。使用カウントが0にならなければそのまま終了します。
7 Dup _os_dup() パスを複製する際に呼び出されます。パスの複製に必要な処理はIOManがやってしまうので、通常は戻り値0でそのままリターンします。
8 Getstat _os_getstat() デバイスステータスを取得する際に呼び出されます。このエントリの実装は自由です。通常はデバイスドライバのGetstatエントリを呼び出します。なにも処理しなかった場合は戻り値E_UNKSVCでエラーリターンします。なにか処理した場合は適切なエラーコードをリターンします。
9 Makdir _os_makdir() ディレクトリを作成する際に呼び出されます。RBFのような階層ディレクトリをサポートするファイルマネージャでは、適切な処理をしてディレクトリを作成します。それ以外のファイルマネージャでは戻り値E_UNKSVCでエラーリターンします。
10 Open _os_open() ファイルがオープンされる際に呼び出されます。RBFのようなマルチファイルシステムでは、適切な処理をしてファイルをオープンします。デバイスドライバのSetstatエントリをSS_OPENで呼び出してパスがOpenされたことをデバイスドライバへ通知します。
11 Read _os_read() データを読み込む際に呼び出されます。デバイスドライバを呼び出すためのパラメタを求めてデバイスドライバのReadエントリを呼び出します。
12 Readln _os_readln() データを読み込む際に呼び出されます。デバイスドライバを呼び出すためのパラメタを求めてデバイスドライバのReadエントリを呼び出します。SCFのような行編集機能を持つファイルマネージャでは、行編集を行います。それ以外のファイルマネージャではReadと全く同じです。
13 Seek _os_seek() ファイルポインタを移動する際に呼び出されます。RBFのようなランダムアクセス可能なファイルマネージャでは、適切な処理をしてファイルポインタの移動を行います。それ以外のファイルマネージャでは、戻り値0でそのままリターンするのが一般的です。
14 Setstat _os_setstat() デバイスステータスを更新する際に呼び出されます。このエントリの実装は自由です。通常はデバイスドライバのSetstatエントリを呼び出します。なにも処理しなかった場合は戻り値E_UNKSVCでエラーリターンします。なにか処理した場合は適切なエラーコードをリターンします。
15 Write _os_write() データを書き出す際に呼び出されます。デバイスドライバを呼び出すためのパラメタを求めてデバイスドライバのWriteエントリを呼び出します。
16 Writeln _os_writeln() データを書き出す際に呼び出されます。デバイスドライバを呼び出すためのパラメタを求めてデバイスドライバのWriteエントリを呼び出します。SCFのような行編集機能を持つファイルマネージャでは、行編集を行います。それ以外のファイルマネージャではWriteと全く同じです。


関数宣言例
error_code Attach(i_attach_pb *, dev_list *);
error_code Chdir(i_chdir_pb *, pd_com *);
error_code Close(i_close_pb *, pd_com *);
error_code Create(i_create_pb *, pd_com *);
error_code Delete(i_delete_pb *, pd_com *);
error_code Detach(i_detach_pb *, dev_list *);
error_code Dup(i_dup_pb *, pd_com *);
error_code Getstat(i_getstat_pb *, pd_com *);
error_code Makdir(i_makdir_pb *, pd_com *);
error_code Open(i_open_pb *, pd_com *);
error_code Read(i_read_pb *, pd_com *);
error_code Readln(i_readln_pb *, pd_com *);
error_code Seek(i_seek_pb *, pd_com *);
error_code Setstat(i_setstat_pb *, pd_com *);
error_code Write(i_write_pb *, pd_com *);
error_code Writeln(i_writeln_pb *, pd_com *);

もどる 次へ