すべての読者の健康!
マイクロカーネルオペレーティングシステム(別名Xameleon Chameleon)のシステムコールの説明に注目してください。 私のカメレオンはまだ卵からhatch化しておらず、仮想マシンで力を得ています。 しかし、彼は非常に孤独であり、小さなトカゲはHabrの住民を知りたいです。
「小核対モノリス」の議論は長年続いてきましたが、双方は小核に基づいたシステムのアーキテクチャについて議論していますか? おそらくこのトピックは、マイクロカーネルシステムのアーキテクチャにいくらかの光を当てるでしょう。
この文書には長い歴史があります-カメレオンにあまりにも多くの時間を費やしていることに気付いた後、メインの仕事で問題が発生しました。 したがって、1石で2羽の鳥を殺し、レポートジェネレーターを宣伝する記事を書き、最終的にドキュメントを作成することにしました。 最初は彼女は英語が分からなかったが、ある時点で恥ずかしがらず、少し上手なロシア語に書き直すことに決めた。
実際、ドキュメントの改訂履歴:

ビジネスに取り掛かろう。 Chameleonオペレーティングシステムは、次のように表示できます。

L4ピスタチオマイクロカーネルに基づいています。 マイクロカーネルは、L4Kaピスタチオマイクロカーネル自体とベースメモリマネージャーL4 Sigma0の2つのモジュールで構成されています。 このドキュメント
L4バージョンX.2リファレンスマニュアル(最新のスナップショット、2010年7月19日)からピスタチオの詳細をご覧ください。
Chameleonオペレーティングシステムは、マイクロカーネルの上にあります。 システムは、マイクロカーネルの上で動作し、IPC(プロセス間通信)-同期メッセージングを実装する特定のシステムコールを介して相互に、およびマイクロカーネルと対話するいくつかのプロセスの形式で編成されます。 システムの基本的なルールは、IPCに基づいたアプリケーションとシステム間の相互作用です(いくつかの例外はあります)。 要求タスクは特別な方法でメッセージを生成し、IPCを呼び出します。IPCはメッセージを受信タスクに送信します。 一部のIPCは、応答が受信されるまでブロックされ、他のIPCは受信側に受け入れられるまでブロックされます。 同期には、メッセージを正常に送信するための要件があります。受信側はそれらを聞く必要があります。 そのため、一部のタスクは常にメッセージを聞く必要があります。 カメレオンのこのようなタスクは、スーパーバイザー、ファイルシステム、ネットワークスタック、デバイスドライバーです。 私たちにとって朗報は、メッセージを待っている状態のタスクはプロセッサのコンピューティングリソースを消費せず、他のタスクにその時間を費やしているという事実です。 私たちにとって最も興味深いのは、L4コンセプトがメッセージの送受信に1つのプリミティブを使用することです-これはIPCメッセージです。 カーネルレベルのメッセージは、1つのシステムコールで構成されます。システムコールには、送信フェーズと受信フェーズのいくつかの組み合わせがあります。
この仕様では、次のデータ型について説明します。最初の5つの型は、マイクロカーネルによって表されます。

それでは、カメレオン-スーパーバイザーの基本的なサービスを詳しく見てみましょう。 マイクロカーネルの観点から見ると、スーパーバイザーは最初のユーザータスクに過ぎないため、アプリケーションプログラム、サービス、またはドライバーである他のタスクは、KIP(カーネルインターフェースページ-L4マイクロカーネルの基本概念)を介してスーパーバイザーのThreadIDを受信できます他のサブシステムのThreadID(GetDeviceHandleシステムコールを使用)。


リソース管理のための22のシステムコール。 これは、仮想メモリの割り当てと解放、メモリ内で事前に準備されたプロセスの開始、ドライバー/プロトコル実装の実行、プロセスへの信号の送信、プログラムスレッド(実行スレッド)の作成、プロセスの完了を待機、プロセスタイマーの設定、その他のいくつかの機能を実行するのに十分です。
システムコールのいくつかをより詳細に検討してください。 スーパーバイザは新しいプロセスを起動できるため、このプロセスのメモリを事前に準備する必要があります。 したがって、新しいプロセスを実行する前に配置するメモリブロックが必要です。 次のシステムコールを使用して、プロセスのメモリを要求できます。

上で言ったように、ドキュメントの最初のバージョンは壊れた英語でした。 残念ながら、仕様全体をロシア化することができなかったため、メッセージ本文の説明は「詐欺」のままでした。
専用メモリを操作するための対称システムコールは、ReferencingSegmentと呼ばれます。 以前に割り当てられたメモリセグメントを解放するには、ReferencingSegment呼び出しを使用して、このセグメントの参照カウンタをリセットする必要があります。 同時に、セグメント自体とセグメントが占有する仮想メモリのページは、AllocateSegmentを使用した後続の割り当てに使用できます。

プロセスは、ExitProcess呼び出しを使用して自身を終了させることもできます。

前のメッセージとは異なり、このメッセージには受信フェーズがありません。 これは、このメッセージの送信後にプロセスが終了するため、スーパーバイザーは確認応答を送信しないためです。 メッセージは、戻りコードという1つのパラメーターを渡します。 このコードは、ProcessWaitシステムコールを使用してプロセスの完了を待機しているタスクに渡されます。

IPCマイクロカーネルは同期呼び出しを使用するため、多くの場合、マルチスレッドを使用することで同期の制限を回避できます。 どのプロセスでも、そのアドレス空間にプログラムスレッド(実行スレッド)を作成できます。 この場合、すべてのスレッドは共通のリソースを共有します。 次のシステムコールは、新しいプログラムスレッドを作成します。

スレッドが作成された場合、それらを停止してリソースを解放する方法が必要です。 これを行うには、ExitThreadシステムコールを使用します。

ちょっとしたユーモア:「カメレオンシステムとアメーバのプロセスには共通点があります。それらは除算によって増加します。」 真剣に、この場合、自転車は発明されておらず、POSIX fork()が基礎として採用されました:

L4プリミティブに基づくfork()関数の実装は簡単ではありませんが、実行可能なタスクです。 この呼び出しの特徴は、1つのプロセスによって呼び出され、2つのプロセスが応答を受け取ることです。呼び出し元プロセスと、新しく作成された呼び出し元プロセスのコピーです。 もちろん、イニシエーターとそのコピーの両方のプロセスは、異なるアドレス空間で実行されます。
このプロセスはそれ自体を複製することができ、興味深い課題に直面します-準備されたイメージから新しいタスクを作成します。 MR2(メッセージレジスタ2)に注意してください-実行中のプロセスのメモリブロックにハンドルを転送します。 このメモリブロックは、上記のAllocateSegmentシステムコールを使用して作成する必要があり、開始するプロセスの準備済みイメージをそこに保存する必要があります。 システムコールは、プロセスの基本パラメーター(エントリポイント、コードセグメントの開始とサイズ、データとBSS)も設定します。

ExecProcessメッセージで渡される最後の2つのパラメーターに注意してください。 上記でまだ説明されていないデータ型-複合が表示されます。 メッセージ本文で送信されるのは要素自体ではなく、記述子です。 ExecProcessメッセージの場合、これらの記述子は2つのメモリブロックを指します-最初のメモリブロックはchar ** argvを渡し、2番目のメモリブロックはchar ** envpを渡します-関数
int mainへの引数の類似物
(int argc、char ** argv、char ** envp) 。
スーパーバイザは基本的なサービスであり、他の登録済みサービスにアクセスするためのインターフェイスを提供します。 たとえば、タスクは、ファイルシステムを使用せずに、シリアルポートドライバーを直接使用したいと考えています。 GetDeviceHandleシステムコールを使用して、登録済みシリアルポートドライバーのThreadIdを確認できます。

GetDeviceHandle呼び出しで受信したThreadIDプロセス識別子を使用して、メッセージを送信したり、応答を受信したりできます。 メッセージの形式はデバイスのタイプによって異なり、次のプロトコルのいずれかで記述できます。
- サービスとの交換の形式。
- ブロックデバイスとの交換フォーマット。
- 文字交換フォーマット。
- ネットワークデバイスとの形式の交換。
次のリンクから、PDF形式の完全な(アルファ版前の)バージョンの仕様をダウンロードしてください:
プロトコルファミリのXameleon仕様 このドキュメントはまだ非常に未加工ですが、あなたのコメントがさらなる修正に力を与えることを願っています。
システムコールについて話し合い、明確にし、エラーを示し、Habréだけでなく、このページでも質問をすることができます:
fotki.yandex.ru/users/almandrykin/album/164974-写真を選択してコメント欄で質問してください。
いくつかのスーパーバイザシステムコールの説明でさえも大きすぎることが起こりました。 関心がある場合は、スーパーバイザーの残りのシステムコール、およびFalovayaシステムのシステムコールの説明、ネットワークサブシステム、ブロック、シンボリック、およびネットワークデバイスドライバーへのシステムコールを説明することができます。
最後に、カメレオンシステム用のプログラムを作成するために使用できる開発ツールについて説明します。 開発では、gcc、g ++、Visual C ++、さまざまなPascalコンパイラなど、ElfまたはPE形式で実行可能ファイルを作成できるプログラミング言語を使用できます。 一般に、コンパイルプロセスは他のシステムでのコンパイルと似ていますが、主なルールはコンパイラに付属する標準ライブラリを使用しないことです。 現在のChameleonの実装では、元のElfベースのlibcと元のcrt0を使用して、POSIX関数のサブセットを提供しています。 PEコードのオブジェクトコードを生成するコンパイラでこのlibcをコンパイルし、コンパイラでMS Visual C ++プログラムをコンパイルすることを妨げるものはほとんどありません。 Pascalでシステムコールを実装することもできますが、この言語はシステムプログラミング用に設計されていないということは誰も言いません。
psドキュメントの作成時に、FastReportレポートジェネレーターが使用されました。
pps私の英語は本当に悪いです。 お世話になってください。 文書全体をロシア語に翻訳することを約束します。