リアルタイム処理に適したAMP
デュアルコアとは対称型マルチプロセッサSMP(Symmetric MultipleProcessor)ですが、
必ずしもSMP型カーネルを使う必要はありません。むしろ組込み機器ではSMPでなくても、
コア毎にカーネルを載せる非対称型マルチプロセッサ(AMP:Asymmetric Multiple Proc
essor)型カーネルの方が良い場合が少なからずあります。つまり、負荷配分を自動で行う
のではなく、プログラマが負荷を予測し思い通りのコアへ処理を割り振ることで負荷配分が
できるからです。μC3/Standardでは拡張機能としてAMPマルチコア拡張を用意し、デュア
ルコア上でAMP型カーネルとして使えるようにしました。
μC3/Standardでは割込み応答性を高めるため、システムコールの処理は割込み許可状
態で実行されます。そのため、割込みから呼び出されたシステムコールはキューイングさ
れ、割込み終了後にまとめて処理されます。このように割込みから呼び出されるシステム
コールは非同期に実行(遅延実行と呼ぶ)され、割込み以外からのシステムコールは呼び
出しに同期して実行されます。図2のようにコア間システムコールも同様に、割込みから呼
び出したシステムコールはバッファリングされ非同期に実行し、割込み以外から呼び出し
たシステムコールはコア間で同期して実行されるなど、安全を考えて通常のシステムコー
ルと同じ振る舞いになるように設計されています。このようにμC3/Standard AMPマルチコ
ア拡張は、AMP型カーネルでありながらコア間で連携しつつシングルコアの場合と同様に
プログラミングできる環境になっています。
一般的なAMP型カーネルと言えば、異なったアーキテクチャのコア間や、マルチプロセッサ
間に対応したカーネルを連想すると思います。この場合は、コア毎にプログラムを作成し、
割込みと共有メモリで通信します。しかし、デュアルコアのように、同じアーキテクチャや、
メモリを含め内蔵デバイスを共有できるとなれば、違った形のAMP型カーネルが考えられま
す。そのAMP型カーネルとは、コア別だったプログラムを一括してリンクすることです。これ
によりコードが共通化され、ポインタ渡しができるなど、より効率の良いプログラミングが可
能になります。図1のように、コードは全てのコアからアクセスできるようにし、データは使用
するコアのみからアクセスできるようにします。また、共通モジュールの静的データ領域は、
異なる物理メモリ領域を異なるコアで同一の仮想アドレスに割り付けます。そして、μC3/St
andardはμITRON4.0仕様に準拠したシングルプロセッサ用のカーネルですが、この手法に
おいてμC3/Standardは共通モジュールとして扱うことができます。
AMP型カーネルにおいても、コア間でシステムコールを呼び出す最小限の機能は必要です。
簡単な実装としては、エージェントと呼ばれる処理を実行させ、呼び出しの対象となるコアの
エージェントが呼び出す側に代わってシステムコールを実行する手法が一般的です。これで
は、ハード的には密結合のプロセッサでありながら、カーネル的には疎結合と言えます。AM
Pマルチコア拡張では、カーネルのクリティカルな部分で通信を行うパイプを持った密結合とし、
待ちの発生しない同期・通信機能を中心としたコア間システムコールが実装されています。
割込み応答性の高いμC3/Standard
μC3/Standardでは割込み応答性を高めるため、システムコールの処理は割込み許可状態
で実行されます。そのため、割込みから呼び出されたシステムコールはキューイングされ、割
込み終了後にまとめて処理されます。このように割込みから呼び出されるシステムコールは
非同期に実行(遅延実行と呼ぶ)され、割込み以外からのシステムコールは呼び出しに同期
して実行されます。図2のようにコア間システムコールも同様に、割込みから呼び出したシス
テムコールはバッファリングされ非同期に実行し、割込み以外から呼び出したシステムコール
はコア間で同期して実行されるなど、安全を考えて通常のシステムコールと同じ振る舞いに
なるように設計されています。このようにμC3/Standard AMPマルチコア拡張は、AMP型カー
ネルでありながらコア間で連携しつつシングルコアの場合と同様にプログラミングできる環境
になっています。