091201

|


加速度モジュール続き。本番のテスト用のLPC2388に継ぎました。急いでるとい
きなりロガーに配線しだすのだけど、ちょっとのんびり。LPC2388はI2Cモジュー
ルが三つある。そのうちの一つだけがオープンドレインでI2Cを完全に満たす。

とりあえずレジスタ定義を書いたところまで。データシートを見ると、やはり ステートを調べるのが複雑だな...。

スケジューラアクティベーション続き。実際のアップコールについて。このあ たりからスケジューラアクティベーションはだめなんじゃないかというような 香りがしてくる。レースコンディションをなんとかするために無理しているよ うな...。
アップコールの一般的で、効率的な枠組がないと。それが簡単ではないのはシ グナルの歴史が物語っているのかもしれないけれど...。
Adding Scheduler Activations to Mach 3.0

Paul Barton-Davis, Dylan McNamee, Raj Vaswani, and Edward D.Lazowska
University of Washington

Technical Report 92-08-03 Reversed March 1993
続き。
2.2 カーネルイベントの扱い

スケジューラアクティベーションの枠組の中で、特定のカーネルイベントはタ
スクに通知される。通知はカーネルからユーザ層へのアップコールとして実装
され、その引数は以下に述べる通りである。カーネルからユーザ層に送られる
のは四つの通知がある。

 + blocked (new_sa, event_sa, interrupted_sas): new_saはevent_saがブロッ
   クされたことを伝える。interrupted_sasは通知を配送するために割込まれ
   たかもしれないアクティベーションを照会する(*)。2.2.1章で述べるように、
   この'blocked'の通知の場合ではこの引数は常にNULLである。(*)この場所は
   interrupt_sas(複数形)と呼ばれる。それはアクティベーションは通知の準
   備をしている間にカーネルの中でブロックされることがあるからだ。この場
   合では、幾つかのアクティベーションは最終的に配送される前に割込まれて
   いるかもしれない。

 + unblocked (new_sa, event_sa, interrupted_sas): new_saはevent_saのブ
   ロックが解除されたことを通知する。interrupt_sasは通知を提供するのに
   横取りされたかもしれないアクティベーションを照会する。

 + preempted (new_sa, event_sa, interrupted_sas): news_saはevent_saがプ
   ロセッサの再割当てよって横取りされたことを通知する。interrupted_sas
   は通知を提供するのに割込まれたかもしれないアクティベーションを照会す
   る。

 + processor_added (new_sa, event_sa, interrupted_sas): new_saは新しく
   プロセッサがタスクに割当てられたことを通知する。この通知では
   event_saとinterrupted_sasは両方ともNULLである。(2.2.4章を見よ)

これらの四つの通知の実装は以下に続く四章で述べる。まず最初に必要となる
背景について規定する。2.2章の以下の部分は相当詳細だということを確認して
おく。

スケジューラアクティベーションの状態の決定的な構成要素はそのユーザ層で
の継続で、それは、カーネルの継続([DBRD91]で述べられた)に似ているが、ユー
ザ層に戻るのではなく、カーネルルーチンを指定して戻る。これを、アクティ
ベーションの実行をアップコールからユーザ層に制御を移したい時に設定する
(2.2.1章を見よ)。

スケジューラアクティベーションはevent_saとinterrupted_sasの二つの引数も
あり、それは他のアクティベーションの場所であり、通知の間にそれらの情報
をユーザ層に伝えることを許している。この情報はアクティベーションそれ自
身、それが実行したいたプロセッサや、そのユーザ層のレジスタ状態を含んで
いる。

カーネルはthread_select ()で、次に事項するスケジューラアクティベーショ
ン、あるいはカーネルスレッドを選択する。

プロセッサ毎のフラグを、thread_select ()が通知が必要かどうかのために管
理する。このフラグの値は、PROC_SA_BLOCKEDがブロックしたイベントに、
PROC_SA_HANDLING_EVENTが通知中に、PROC_ALLOCATEDが、プロセッサセット間
でのプロセッサの再割当てである。thread_select()が、プロセッサのイベント
フラグがこれらの値であれば、通知をする手配をする。

次の章では、一般的な用語でイベントの扱いについて述べる。さらに詳細な
記述は付録 A.3にある。