Windows 95でMS-DOSはどのような役割を果たしましたか?

Windows 95のMS-DOSは、2つの目的で使用されました。 Windows 95が起動すると、特別なバージョンのMS-DOSが最初に読み込まれ、 CONFIG.SYS



ファイルを処理し、 COMMAND.COM



起動してAUTOEXEC.BAT



を実行し、最終的にWIN.COM



実行して、32ブートプロセスを開始しました。ビット仮想マシンマネージャーVMM



この特別なバージョンのMS-DOSは、「完全に機能する」という言葉が一般にMS-DOSに当てはまる程度まで完全に機能していました。 他の方法はありえませんでした。MS-DOSエミュレーションモードに入ると、このバージョンのみが機能し続けました。



WIN.COM



プログラムは、ほとんどの人がWindows自体と呼ぶもののダウンロードを開始しました。 MS-DOSのコピーを使用して、仮想マシンマネージャーをダウンロードし、 SYSTEM.INI



ファイルを読み取り、仮想デバイスドライバーをロードし、EMM386(存在する場合)をオフにして、保護モードに切り替えました。 ほとんどの人の観点から見た「リアルウィンドウ」-保護モードです。



保護モードでは、仮想デバイスドライバーが魔法をかけました。 それらのアクションの中には、MS-DOSの状態全体引き出し 、32ビットファイルサブシステムの状態に転送し、MS-DOSを無効にすることがありました。 それ以降のすべてのファイル操作は、32ビットファイルサブシステムに送信されました。 プログラムがint 21h



にアクセスすると、32ビットファイルサブシステムが処理を担当することが判明しました。



これは、2番目のMS-DOSの役割が作用する場所です。 おわかりのように、MS-DOSプログラムとドライバーは、オペレーティングシステムの深部に埋め込むのが大好きでした。 21h



割り込みハンドラーを置き換え、システムコードにパッチを適用し、低レベルのディスクハンドラーint 25h



およびint 26h



置き換えることができます。 また、ディスクの操作を担当するint 13h



などのBIOS割り込みを使用して、 int 13h



べきことを行うこともできます。



プログラムがint 21h



にアクセスしたとき、要求は最初に32ビットファイルサブシステムに送信され、そこでいくつかの前処理が行われました。 次に、誰かがint 21h



ベクトルをインターセプトしたことをファイルサブシステムが検出すると、インターセプターの実行を許可するために16ビットコード戻ります。 ベクトルint 21h



置き換えは、ウィンドウのサブクラス化int 21h



イデオロギー的に似ています。 古いベクトルを取得し、新しいベクトルを設定します。 設定したハンドラーが呼び出されたら、何かをしてから古いハンドラーを呼び出します。 古いハンドラーから戻った後、コントロールを返す前に何か他のことができます。



CONFIG.SYS



からロードされた16ビットドライバの1つはIFSMGR.SYS



。 彼の仕事は、他のすべてのドライバーとプログラムがチャンスを得る前に、 まずMS-DOSインターセプトすることでした! このドライバーは32ビットファイルサブシステムと共謀して、16ビットコードから32ビットに戻り 、ファイルサブシステムが作業を続行できるようにしました。



言い換えれば、MS-DOSは非常に巧みなおとりでした。 16ビットのドライバーとプログラムは、実際のMS-DOSのように見えたハンドラーにパッチを当て、インターセプトしましたが、実際には餌でした。 32ビットファイルサブシステムが誰かが餌を購入したことを確認した場合、おとりのアヒルを偽造しました。



MS-DOSに導入された「悪意のある」ドライバーやプログラムのないシステムから始めましょう。





それは楽園です。 32ビットファイルサブシステムは、派手なことをする迷惑なドライバーと対話することなく、すべての作業を行うことができました。 MS-DOS状態変数を更新する追加のステップに注意してください。 ダウンロード中にそれらを抽出しましたが、ドライバーとプログラムはしばしばそれらを「知って」おり、オペレーティングシステムをバイパスして状態変数を直接操作したため、それらを最新の状態に保ちます。 その結果、ファイルサブシステムはMS-DOSの責任の幻想をサポートすることになっており(MS-DOSは実際には動作していませんでしたが)、そのようなドライバーとプログラムは期待どおりに見えました。



また、状態変数は仮想マシンごとに異なることに注意してください。 (つまり、開いている各MS-DOSセッションは、状態変数の独自のコピーを受け取りました。)最後に、 各MS-DOSセッションには、個別の現在のフォルダー 、個別のファイルテーブルなどがありました。 ただし、開いているファイルの実際のリストは32ビットファイルサブシステムに格納されていたため、これはすべてパフォーマンスでした。 ディスクキャッシュは一貫している必要があり、ファイル共有の制限はグローバルにチェックする必要があったため、そうでなければできませんでした。 1つのMS-DOSセッションが排他的アクセスのためにファイルを開いた場合、別のMS-DOSセッションで実行されているプログラムによる同じファイルを開く試みは失敗するはずです。



まあ、それは単純なケースでした。 ハードケース: int 21h



をインターセプトしたドライバーがありました。 このドライバーが何をするのかわかりません。たとえば、これはネットワークドライブのI / Oをインターセプトし、特に何らかの方法で処理するネットワークドライバーです。 また、MS-DOSセッションで実行されているTSRプログラムがint 21h



をインターセプトしてint 21h



が呼び出されたときに画面1に印刷され、 int 21h



終了したときに2に印刷されるとします
。 ローカルドライブ(ネットワークドライバーではないため、ネットワークドライバーは何もしない)へのアピールをトレースしてみましょう。





32ビットファイルサブシステムがすべての作業を引き続き行うことに注意してください。 呼び出しは、16ビットMS-DOSの責任の幻想を維持するためにのみ、16ビットチェーン全体を通過します。 16ビットの世界では、TSRとドライバーによってインストールされたコードのみがIFSMGR



、さらにコンポーネントをリンクするIFSMGR



小さな断片がIFSMGR



されました。 16ビットMS-DOSコードは実行されませんでした。 32ビットファイルシステムは、MS-DOSからのすべての作業を傍受しました。



I / Oサブシステムが16ビットデバイスドライバーからハードドライブを制御したときに、「通常の操作を傍受するが、誰かが異常なアクションを要求した場合に異常なアクションを許可する」という同様のダンスが発生しました。 サブシステムがドライバーを認識した場合、32ビットファイルサブシステムが16ビットMS-DOSの代わりに操作を処理したのと同じ方法で、ドライバーのステータスを収集し、すべての操作を処理しました。 一方、サブシステムがドライバーを認識しなかった場合、サブシステムはディスクの責任を負います。 コマンドを32ビット環境から16ビットドライバーに送信するコンポーネントはRMMと呼ばれていました



何らかの種類のディスクにRMMを使用することが不運な場合、おそらくこのディスクでの操作のパフォーマンスがひどいことに気づいたでしょう。 この理由は、高速のマルチスレッド32ビットドライバーではなく、古い厄介な16ビットドライバーを使用しているためです。 (16ビットドライバーは1つのI / O操作を処理していましたが、16ビットドライバーはマルチスレッド用に設計されていないため、別のI / Oを処理することはできませんでした。)



奇妙に思えるかもしれませんが、RMMを使用することはMS-DOSウイルスがコンピュータに感染する初期の兆候だったため、RMMは恐ろしいため有用であることが判明しました。 最終的に、MS-DOSウイルスはTSRおよびドライバーと同じことを行いました。それらは割り込みベクトルをインターセプトし、ハードドライブの制御を獲得しました。 I / Oサブシステムの観点から見ると、16ビットのハードディスクドライバーのように見えました。 「Windowsが突然ひどくスローダウンし始めた」と人々が不平を言ったとき、コントロールパネルのシステムパフォーマンスページに誘導し、「一部のディスクはMS-DOSモードで動作します」または「すべてのディスクはMS-DOS互換モードを使用します」という行があるかどうかを尋ねました。 その場合、RMMがディスクを担当し、ハードウェアを変更しなかった場合、おそらくウイルスを意味していました。



最後に、MS-DOSの一部はI / Oに関連していませんでした。 たとえば、メモリの割り当てFCB形式のワイルドカードを使用した文字列の解析などの関数がありました。 これらの関数はMS-DOSで処理されました。これらは「補助ライブラリ」の関数であり、「はい、やった」と言う可能性を除いて、32ビットコードでの書き換えの恩恵を受けませんでした。 古い16ビットコードは正常に機能し、既製のコードを使用することにより、MS-DOSにパッチを適用したプログラムとの互換性を維持して、そのような関数の動作を変更できました。



元の記事に対する最初のコメント:「最も印象的なのは、ほとんどの場合、ほとんどの時間は本当に(ほとんど)働いていたことです。」



All Articles