マットが書いたように、これはおそらく不当に範囲が定められています。ただし、調査を開始するのに役立つことを期待して、1つの合理的な範囲の質問と同じように質問の合計に注意を向けるようにします。
1「プリエンプション」と「コンテキストスイッチ」の違いは何ですか?
プリエンプションは、プロセスが関与せずにプロセスを中断する行為です。このコンテキストでは、それはおそらくタイマー割り込みが発生することを意味します。この言葉は、先取りの法的概念から来ています。つまり、他の人の前に、または他の人に優先して主張または購入する行為または権利です。 つまり、タイマー割り込みが発生すると、割り込みサービスルーチン(ISR)が以前に実行されていたコードよりも優先されます。これは必ずしもカーネルを含む必要はありません。プリエンプティブに実行される任意のISRでコードを実行できます。
コンテキストスイッチは、OSコード(プリエンプティブに実行)が、あるプロセスまたはスレッドのコンテキストと別のプロセスの間でプロセッサの状態(レジスタ、モード、およびスタック)を変更したときに発生するものです。プロセッサの状態は、1つのスレッドの特定のコード行にある場合があります。レジスタ内の一時データ、メモリの特定の領域でのスタックポインタ、およびその他の状態情報が含まれます。プリエンプティブOSは、この状態を(静的メモリまたはプロセスのスタックに)格納し、前のプロセスの状態をロードできます。これは、コンテキストスイッチとして知られています。
2プリエンプティブカーネルと非プリエンプティブカーネルの主な違いは何ですか?カーネルをプリエンプティブにするためにプログラマーに必要なすべての作業は何ですか?
プリエンプティブカーネルでは、任意の2つのアセンブリ命令(「シーケンスポイント」と呼ばれる)の間に割り込みが発生する可能性があります。非プリエンプティブカーネルでは、実行中のプロセスがyield()
関数を呼び出して、他のスレッドを実行できるようにする必要があります。プリエンプティブカーネルはより複雑ですが、並行性のより良い錯覚を提供します。非プロンプトカーネルは、を使用して非常に簡単に実行できますsetjmp.h
が、各スレッドは定期的に呼び出す必要yield()
があります。そうしないと、他のスレッドは実行されません。
のような関数yield()
が呼び出されると、プロセッサの状態が自動的に保存されます。OSをプリエンプティブにする場合は、この情報を手動で保存する必要があります。
3ユーザーモードを作成して操作する方法は?
ARMドキュメントによると、ユーザーモードでは、特権モードに切り替わる命令はすべて未定義の命令として扱われます。
正しい。ただし、割り込みはすべて特権モードで自動的に実行されるとも言われています。ARMシステムでは、このsvc
命令を使用してソフトウェア割り込みを生成できます。これで、SVCコード(OSの一部)を特権モードで実行できるようになります。
4もしそうなら、ユーザースペースプログラムがカーネルコードを使用する唯一の方法はシステムコールですか?
正しい。少なくとも、これが唯一の安全または正しい方法です。
5カーネルはどのようにユーザースペースに応答または対話しますか?
ARMでは、SVC命令は8ビット値を取得できます。これを使用して、yield、割り込みの有効化、割り込みの無効化など、必要な256のシステムコールを生成できます。必要に応じて、共有メモリまたはメッセージパッシングインタラクションメカニズムを作成することもできます。
6それは、(単純なシステムで)起動した後の唯一のカーネルスレッドがアイドルスレッドになることを意味しますか?
それは、システムの設計方法に完全に依存します。すべてのスレッドが作成された後でのみカーネルを起動することを選択した場合は、おそらく簡単です。そうすれば、スレッドの動的な割り当てについて心配する必要はありません。または、アイドル状態のスレッドから始めて、後で他のスレッドを追加することもできます(リモートシェルを介して?少なくとも1つのユーザースレッドを一貫して実行する必要があると思います...)
7ユーザープロセスに切り替えるときにカーネルコードとデータが存在するページがマップされていない場合、システムコールまたは割り込みで、仮想アドレス空間にマップされずにカーネルコードはどのように実行されますか?
以前にユーザーモードで実行されていた場合でも、カーネルモードコードが特権モードで実行されるのと同様に、プロセスコードが別のアドレス空間を使用している場合でも、カーネルモードコードはメインスタックポインター(MSP)から実行されます。
8「プリエンプティブカーネル」とは、カーネルコードの実行中にコンテキストスイッチを使用しても安全な方法でカーネルが設計されたことを意味するだけですか?それとも、もしあれば、もっと多くの作業を行う必要がありますか?
これは、カーネル自体がプリエンプションされるのではなく、カーネルがユーザーコードをプリエンプションできることを意味すると思います。カーネルを中断することは困難で珍しいことです。それにはもっと作業が必要になるでしょう、そして私はあなたがそれを望む理由を理解するのに苦労しています。