8

ちょっとしたイントロ、

私は現在、小さな(小さな読み取り)RTOSカーネルを書いています。まあ、それはカーネル内のほとんどのものでモノリシックであると思われます。しかし、以下のいくつかのことについては多くの情報を見つけることができません。それは非常に役に立ちます。それ以外に、それは実際にはある種の大学のプロジェクトではなく、私が自分の意志で行っていることです。

すべての質問に答えるより良い代替案は、できればユーザースペースを実装し、プリエンプティブである(ただし、Linuxのように複雑ではない)arm用の無料で入手可能なRTOS(または無料の本)を私に紹介できるかどうかです。Linuxには、これまでに見た中で最悪のドキュメントがいくつかあります(Linuxコードから物事を理解しようとしましたが、数百万のファイルに散在する定義がたくさんあり、奇妙な名前の関数フックなど、バージョンごとに名前が変更されています時々動いた...)

  1. 「プリエンプション」と「コンテキストスイッチ」の違いは何ですか?

  2. プリエンプティブカーネルと非プリエンプティブカーネルの主な違いは何ですか?カーネルをプリエンプティブにするためにプログラマーに必要なすべての作業は何ですか?

  3. ユーザーモードを作成して操作する方法は?

    ARMドキュメントによると、ユーザーモードでは、特権モードに切り替わる命令はすべて未定義の命令として扱われます。

  4. もしそうなら、ユーザースペースプログラムがカーネルコードを使用する唯一の方法はシステムコールですか?

  5. では、カーネルはどのようにユーザースペースに応答または対話しますか?

  6. これは、(単純なシステムで)起動した後の唯一のカーネルスレッドがアイドルスレッドになることを意味しますか?

  7. ユーザープロセスに切り替えるときにカーネルコードとデータが存在するページがマップされていない場合、システムコールまたは割り込みで、仮想アドレス空間にマップされずにカーネルコードはどのように実行されますか?

  8. 「プリエンプティブルカーネル」とは、カーネルコードの実行中にコンテキストスイッチを使用しても安全な方法でカーネルが設計されたことを意味するだけですか?それとも、もしあれば、もっと多くの作業を行う必要がありますか?

ああ、そのような複数の質問がここで許可されていない場合、申し訳ありませんが、それについては何も見つかりませんでした。

4

3 に答える 3

16

マットが書いたように、これはおそらく不当に範囲が定められています。ただし、調査を開始するのに役立つことを期待して、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「プリエンプティブカーネル」とは、カーネルコードの実行中にコンテキストスイッチを使用しても安全な方法でカーネルが設計されたことを意味するだけですか?それとも、もしあれば、もっと多くの作業を行う必要がありますか?

これは、カーネル自体がプリエンプションされるのではなく、カーネルがユーザーコードをプリエンプションできることを意味すると思います。カーネルを中断することは困難で珍しいことです。それにはもっと作業が必要になるでしょう、そして私はあなたがそれを望む理由を理解するのに苦労しています。

于 2012-07-22T17:54:59.517 に答える
1

列挙された各質問に答えるのではなく、(ありがたいことに)太字の要求に対応するために最善を尽くします。

すべての質問に答えるより良い代替案は、私に無料で入手できる腕用のRTOS(または無料の本)を参照してもらうことです。

MicriumのuC/OS-IIIは、優先度ベースのリアルタイムカーネルであり、(もちろん)同期プリエンプションと非同期プリエンプションの両方をサポートします。そして、運が良ければ(そして私が返信する理由は)無料の本が利用可能であり、ソースコードも利用可能であるということです。

uC / OS-IIIのメインページにアクセスすると、左側にソースコードの入手可能性について説明しているビデオへのリンクが表示されます(「uC / OS-IIIソースが利用可能です」)。

書籍に関しては、プロジェクトページに移動し、ターゲットに最も近い書籍を選択してください。材料の90%は同じです。CPU固有のもの(コンテキスト切り替え、割り込み、初期化など)のみが本ごとに異なります。

本とコードをダウンロードするには登録する必要がありますが、私には公平に思えます。

頑張って楽しんでね。あなたの究極の要求/目標を太字で示してくれてありがとう、それはこれをはるかに簡単にしました。

于 2012-07-24T03:11:05.557 に答える
1

uC / OS-IIIは無料ではなく、ライセンスされているという印象を受けました。

優れた無料のRTOSは、非常によく説明されていますが、FreeRTOS(http://www.freertos.org/)です。

あなたは間違いなくそこを見てください

于 2012-07-24T05:20:57.367 に答える