OSアーキテクチャインフェルノ-1

私はすぐに、アーキテクチャの完全なレビューを行うつもりはないと警告します。 まず、すべてが詳細に説明されている元のドキュメントがあります。 第二に、アーキテクチャの詳細な説明を書き始めるほどInfernoをよく知らない。 しかし、私は間違いなくアーキテクチャの「チップ」についてお話します。これは最も興味深いものです。



Infernoの下でLimboとshの2つの言語でプログラムすることができます。 shでは、ほとんどすべてをLimboと同じように実行できますが、非常にゆっくりです。 システムアーキテクチャとの相互作用の観点からは、実際にはそれらの間に違いはないため、Limboのプログラミングの観点からすべてをさらに説明します。



プログラムとライブラリ



Infernoでは、プログラム(アプリケーション、スクリプト)とライブラリ(.so-共有オブジェクト、.dll)に違いはありません。 Limbo上のすべてのプログラムはモジュールであり、他のプログラム/モジュールでそのまま使用できます。 つまり 1つの「プログラム」は、他の「プログラム」を通常のライブラリのようにいつでもメモリにロードし、その関数の呼び出しを開始できます。 また、必要な関数の呼び出しが終了すると、不要になったモジュールをメモリからアンロードできます(ロード/アンロードは、プログラムの起動時ではなく、実行時に発生します)。



Infernoの「プログラム」とは、「コマンド」インターフェイスと互換性のあるモジュールを意味します。つまり、モジュールには、2つのパラメーター(グラフィカルコンテキストと引数のリスト)を取り、何も返さないinitという関数があります。



shコマンドプロンプトで実行するプログラムの名前(lsやpwdなど)を入力するとどうなるか知っていますか? 面白いことは起こります-shは単に、入力した名前のモジュールのバイトコードを持つファイルをディスク上で見つけ、それをロードして、そのinit関数を呼び出します。 そして、initが完了すると、shはこのモジュールをメモリからアンロードし、次のコマンドに名前が付けられるのを待ちます。 :)(正直に言うと、実際にはすべてが少し複雑ですが、本質はまさにそれです。)したがって、 インフェルノにはsiskolsのPOSIX exec *()ファミリー全体に類似するものはありません。 :)



インターフェース



これは最も重要な瞬間ではありませんが、私たちはそれについて話しているので... Limboは強く型付けされた言語であり、型チェックはコンパイル段階と実行段階の両方で実行されます。 モジュールをロードすると、変数でそのハンドラーを取得します。この変数の型は、このモジュールに含まれる関数/定数、パラメーターの種類などを決定する必要があります。 このすべての経済の説明は、モジュールインターフェイスと呼ばれます。 (同様のスキームがpascalで使用されています-インターフェイスの個別の説明とモジュールの個別の実装もあります。)



さらに、1つのモジュールで複数の異なるインターフェイス(関数/定数のセット)を実装できます。 また、1つのインターフェイスは、さまざまなモジュールでさまざまな実装を行うことができます(「コマンド」インターフェイスの場合に使用されます)。



また、Limboモジュールをロードするときは、実装ファイル(モジュールのバイトコード)へのパスとインターフェイス名(Cの.hファイルをインクルードする方法でインターフェイスの説明を読み込む)の両方を指定する必要があります。 その後、Limboは指定した実装とインターフェイスの互換性を確認できます。すべてが正常であれば、指定したインターフェイスのタイプを持つこのモジュールのハンドラーが返されます。



メモリの使用については、すべてが正しく行われます-メモリには、すべてのInfernoプロセスのロードされたモジュールのコードのコピーが個別に保存され、このモジュールの各ハンドラには、スタック、グローバル変数などを保存するための個別のメモリがあります このモジュールの。 ハンドラーをアンロードすると、グローバル変数/スタックのコピーによって占有されていたメモリの一部が解放され、最後のハンドラーが解放されると、モジュールコード自体がアンロードされます。



プロセスとスレッド



Infernoでは、プロセスとスレッドの間に違いはありません。 実際、すべてのInfernoプロセスは非常に軽いスレッドです。



ホストOSスレッドでのInfernoスレッドの表示方法(InfernoがWindows / Linux /などでホストモードで実行されている場合)このホストOSのInfernoの実装に依存します。 私の知る限り、Infernoは混合モデルを使用しています-その内部スレッドの一部、つまり 単一のプロセス/ホストOSスレッドには複数のInfernoスレッドを含めることができ、一部のInfernoスレッドは1対1のホストOSスレッド(特に、ソケットからの読み取りなど、syscallホストOSブロックを実行するスレッド)に表示されます。



実際、内部から実行されているOS Infernoは、すべてのメモリを調べて、他のスレッドと同等の実行の束のように見えます。 そして、これはスレッドの一部が「あたかも」1つの動作中のアプリケーションを参照し、一部が別の動作中のアプリケーションを参照しているという事実にもかかわらずです-これらはすべてあなたの頭の中にあり、Infernoはアプリケーションごとのスレッドのグループ化を気にしません。



他のアプリケーションのメモリ保護が不足していることを恐れ、DOSを思い出した場合は、安心してください。この問題は、Infernoの他の多くのアプリケーションと同様に、アーキテクチャレベルで解決され、「保護」するための特別な努力は必要ありません。 つまり、Dis(仮想マシン)では、アドレスのメモリに直接アクセスする方法はありません。すべてのポインタは、本質的にメモリの固定セクションへの高レベルリンクです。 したがって、すべてのスレッドは、ポインタを持つメモリのセクションにのみアクセスできます。 メモリーの既存の(つまり、他のスレッドによって割り当てられた)セクションへのポインターは、パラメーターによってのみ、またはスレッド間のIPCを介してスレッドによって取得できます。 したがって、 強力なDis型付けは、「副作用」として絶対的なメモリ保護を提供します 。 :)



All Articles