ファイル制御ブロック( FCB ) は、開いているファイルの状態が維持されるファイル システム構造です。FCB はオペレーティング システムによって管理されますが、オペレーティング システムのメモリではなく、ファイルを使用するプログラムのメモリに存在します。これにより、ファイルごとに FCB に十分なメモリを割くことができれば、プロセスは一度に任意の数のファイルを開くことができます。
FCB はCP/Mに由来し、 DOSのほとんどのバリアントにも存在しますが、 MS-DOSバージョン 2.0 以降では下位互換性対策としてのみ使用されています。完全な FCB の長さは 36 バイトです。CP/M の初期バージョンでは 33 バイトでした。この固定サイズは、アプリケーションの互換性を損なうことなく増やすことができなかったため、FCB は最終的にファイルにアクセスする標準的な方法として使用されなくなりました。
FCBのいくつかのフィールドの意味はCP/MとDOSで異なり、また実行される操作によっても異なります。以下のフィールドは一貫した意味を持ちます: [1]
オフセット0x0Cから始まる20バイト長のフィールドには、ファイルに関する追加情報を提供するフィールドが含まれていました。[2]
新しい情報がこの20バイトに収まらなくなるまで、新しいバージョンのDOSではさらに値が使用されました。ファイル属性を保存するために、CP/MゼロページとDOSプログラムセグメントプレフィックスの予約領域から、先行する「負のオフセット」バイトがいくつか圧縮されました。[1]
使用法
CP/M、86-DOS、PC DOS 1.x/MS-DOS 1.xxでは、FCBがファイルにアクセスする唯一の方法でした。DOSでは、いくつかのINT 21hサブファンクションが、FCBを使用してファイルを操作するためのインターフェイスを提供しました。[1] [3] [4] MS-DOS 2で、複数のプロセスまたはユーザーをサポートしたり、[3] [ 4 ] FAT以外のファイルシステムを使用したり、将来的にネットワーク経由でファイルを共有したりする準備が整うと、FCBはそのような機能に必要な追加データを処理するには小さすぎると感じられ、 [ 4]そのため、FCBは将来のさまざまな拡張パスには不十分であると見なされました。[3]また、サブディレクトリを指定するフィールドも提供しませんでした。[3]ファイルシステム関連のデータをユーザー空間に公開することも、セキュリティ上のリスクと見なされました。[4]そのため、FCBはUNIXとその派生システムで使用されるファイルハンドルに置き換えられました。[3]ファイルハンドルは、特定の開いているファイルに関連付けられた連続した整数です。
プログラムが新しいファイル ハンドル API を使用してファイルを開く場合、オペレーティング システムは、そのファイルに関連付けられた内部データ構造を独自のメモリ領域で管理します。これには、アプリケーション プログラムとの互換性を損なうことなく、これらの構造をオペレーティング システムの後のバージョンでサイズを大きくできるという大きな利点があります。欠点は、 DOS のメモリ管理がかなり単純であるため、最も「ファイルを必要とする」プログラムが使用する可能性のあるこれらの構造のスペースをブート時に予約する必要があり、コンピュータの実行中は他の目的に使用できないことです。このようなメモリ予約は、CONFIG.SYSファイルのFILES = ディレクティブを使用して行われます。この問題は、DOS 1 または CP/M の FCB では発生しません。オペレーティング システムは、開いているファイルについて知る必要のあるすべての情報を FCB 内に保存するため、オペレーティング システムのメモリ領域でファイルごとのメモリを使用する必要がないためです。 MS-DOS 3 以降で FCB を使用する場合、FCB の形式は、SHARE.EXE がロードされているかどうか、FCB がローカル ファイルを参照しているかリモート ファイルを参照しているかによって異なり、多くの場合 SFT エントリを参照します。このため、DOS 3 以降で一度に開いたままにできる FCB の数も制限されており、通常は 4 です。CONFIG.SYSファイルでFCBS = ディレクティブを使用すると、必要に応じてその数を超えて増やすことができます。DR -DOSでは、FILES と FCBS の両方が、使用可能なハンドル構造の同じ内部プールから取得され、必要に応じて動的に割り当てられます。[5]
FCBは、 FAT32ファイルシステムが導入されるまで、MS-DOSとWindowsのすべてのバージョンでサポートされていました。Windows 95、Windows 98、Windows Meは、32ビットのクラスタ番号のため、ボリュームラベルの読み取りを除いて、FAT32ドライブでのFCBの使用をサポートしていません[4] 。これにより、 WordStarなどの一部の古いDOSアプリケーションは、これらのバージョンのWindowsでは機能しなくなりました。
FCB インターフェイスは、 Windows NT、2000などでも正常に動作しません。WordStar はこれらのオペレーティング システムでは正常に機能しません。DOS エミュレーターDOSEMUおよびDOSBox はFCB インターフェイスを適切に実装しているため、FCB を必要とする古い DOS プログラムを最新のオペレーティング システムで実行できます。
ディスク転送領域
FCB と一緒に使用される関連データ構造は、ディスク転送領域(DTA) でした。[2]これは、ファイルの内容 (レコード) が読み書きされるバッファーに付けられた名前です。FCB を使用する DOS のファイル アクセス関数は、DTA の固定位置を想定しており、最初は PSP の一部を指していました (次のセクションを参照)。この位置は DOS 関数を呼び出すことで変更でき、その後のファイル アクセスでは暗黙的に新しい位置が使用されます。
FCB メソッドが廃止されたことにより、ファイル ハンドルを使用する新しいファイル アクセス関数では、関数呼び出しごとにファイル コンテンツ用のメモリ バッファーを指定する手段も提供されるようになりました。これにより、同時実行可能な独立したバッファー (異なるファイル用または同じファイル用) を維持することがはるかに実用的になりました。
プログラムセグメントプレフィックスとプログラムの初期化
シェル(COMMAND.COM )から起動されるすべてのDOS実行ファイルには、プログラムセグメントプレフィックス(PSP)と呼ばれる256バイト長のデータ構造があらかじめ用意されています。この構造内の関連フィールドには以下が含まれます。[2]
このデータ構造は、プログラムの開始時に DOS によって DS および ES セグメント レジスタにアドレスが提供されるデータ セグメントの先頭にあります。プログラムのコマンド ラインをアドレス 0x81 にそのまま提供するほかに、DOS はコマンド ラインの最初の 2 つの単語に対応する 2 つの FCB を構築しようとします。これは、これらの単語が操作対象のファイル名である一般的なケースでプログラマの作業を省くためです。これらの FCB は開かれていないため、これらのコマンド ラインの単語がファイルを参照していなくても問題は発生しません。
DTA の初期アドレスは、コマンド ライン引数が格納されている PSP 内の領域 (アドレス 0x80) をオーバーレイするように設定されていたため、プログラムが DTA のアドレスを他のメモリ領域に変更しない限り (または、すぐにファイル ハンドルが推奨されるようになった DTA/FCB 関数をまったく使用しない限り)、プログラムは DTA を使用する DOS 関数 (ファイル レコードの読み取りなど) を呼び出す前に、コマンド ライン引数のこの領域を解析する必要がありました。
参照
参考文献
- ^ abc 「FCB - 標準 DOS ファイル制御ブロック」。
- ^ abc ロドリゲス・ロセロ、ミゲル (1992)。8088-8086/8087 Programacion Ensamblador En Entorno MSDOS (スペイン語)。エディシオネス・アナヤ・マルチメディア。ISBN 84-7614-128-9。
- ^ abcdef マーク・ズビコウスキー、ポール・アレン、スティーブ・バルマー、ルーベン・ボーマン、ロブ・ボーマン、ジョン・バトラー、チャック・キャロル、マーク・チェンバレン、デビッド・チェル、マイク・コーリー、マイク・コートニー、マイク・ドライフース、マイク、レイチェル・ダンカン、カート・エックハート、エリック・エバンス、リック・ファーマー、ビル・ゲイツ、マイケル・ギアリー、ボブ・グリフィン、ダグ・ホガース、ジェームズ・W・ジョンソン、カメル・カーマーニ、エイドリアン・キング、リード・コッホ、ジェームズ・ランドウスキー、クリス・ラーソン、トーマス・レノン、ダン・リプキー、マーク・マクドナルド、ブルース・マッキニー、パスカル・マーティン、エステル・マザーズ、ボブ・マシューズ、デビッド・メリン、チャールズ・マーゲンタイム、ランディ・ネビン、ダン・ニューウェル、タニ・ニューウェルNorris, David; O'Leary, Mike; O'Rear, Bob ; Olsson, Mike; Osterman, Larry; Ostling, Ridge; Pai, Sunil; Paterson, Tim ; Perez, Gary; Peters, Chris; Petzold, Charles ; Pollock, John; Reynolds, Aaron ; Rubin, Darryl; Ryan, Ralph; Schulmeisters, Karl; Shah, Rajen; Shaw, Barry; Short, Anthony; Slivka, Ben; Smirl, Jon; Stillmaker, Betty; Stoddard, John; Tillman, Dennis; Whitten, Greg; Yount, Natalie; Zeck, Steve (1988)。「技術アドバイザー」。MS -DOS 百科事典: バージョン 1.0 から 3.2。Duncan , Ray; Bostwick, Steve; Burgoyne, Keith; Byers, Robert A.;ホーガン、トム; カイル、ジム;レトウィン、ゴードン;ペッツォルト、チャールズ; ラビノウィッツ、チップ; トムリン、ジム; ウィルトン、リチャード; ウォルバートン、ヴァン;ウォン、ウィリアム; ウッドコック、ジョアン(完全改訂版)。レドモンド、ワシントン州、米国:マイクロソフトプレス。ISBN 1-55615-049-0. LCCN 87-21452. OCLC 16581341.(xix+1570ページ; 26cm) (注: この版は、撤回された1986年の初版を別の著者チームによって大幅に改訂した後、1988年に出版されました。[1])
- ^ abcdefg Chappell, Geoff (1994 年 1 月). Schulman, Andrew; Pedersen, Amorette (編). DOS 内部. Andrew Schulman プログラミング シリーズ (第 1 刷、第 1 版). Addison Wesley Publishing Company . ISBN 978-0-201-60835-9。(xxvi+738+ivページ、3.5インチフロッピー[2][3]) 正誤表:[4][5][6]
- ^ ポール、マティアス R. (1997-07-30)。 NWDOS-TIP — Novell DOS 7 に関するヒントとコツ、詳細、バグ、回避策を含む Blick です。リリース 157 (ドイツ語) (第 3 版)。 2017-08-23 のオリジナルからアーカイブ。2012 年 1 月 11 日に取得。
{{cite book}}:|work=無視されます (ヘルプ) (注: NWDOSTIP.TXT はNovell DOS 7およびOpenDOS 7.01に関する包括的な作業であり、多くの文書化されていない機能と内部の説明が含まれています。これは、2001 年まで維持され、当時多くのサイトで配布されていた、著者のさらに大規模な MPDOSTIP.ZIP コレクションの一部です。提供されているリンクは、HTML に変換された NWDOSTIP.TXT ファイルの古いバージョンを指しています。)
さらに読む
- Brown, Ralf D.編 (2000-07-17)。「210F: DOS 1+ - FCB を使用してファイルを開く」。Ralf Brown の割り込みリスト61。ctyme.com。2016-06-19にオリジナルからアーカイブされました。[7]
- Elliott, John C. (2002-12-29). 「CP/M ファイル制御ブロック」。Seasip.info。2017-08-23にオリジナルからアーカイブ。2017-08-23に取得。
- 「CP/M 内部」。2017 年 8 月 23 日。2017 年 8 月 23 日にオリジナルからアーカイブ。2017年 8 月 23 日に閲覧。- CP/M FCBの詳細な説明
