R2Linux : 高信頼性組込リアルタイム Linux
--- Reliable and Realtime Linux for Embedded Mission Critical Systems ---

開発計画の概要

2003/09/25

背景

近年、組込み機器の開発プラットフォームにおいてLinuxが注目されている。特に携帯情 報端末(PDA)やホームサーバ等において、組込みLinuxを採用する事例が増えつつある。 しかし、同じ組込み機器でもFA、プラント、航空、医療機器等のMission Criticalシステムにおいて利用するには、 現在利用されている市販のリアルタイムOSと比べて以下の3つの課題が存在する。

  1. 制御演算が一定周期で確実に動作するリアルタイム性の不足
  2. 数年に及ぶ連続稼働を実現するための信頼性の不足
  3. トラブル発生時に原因究明するためのシステム状態記録解析機能の不足

本開発プロジェクトでは、組込みプロセッサSH4を対象に、 以上の3点の課題を解決する改良開発を行う。 すなわち、Linuxのリアルタイム性の向上、信頼性の向上、 トラブル解析機能の開発である。本開発プロジェクトの成果を用いることによって、 Mission Critical システムに要求される長期的総合的な高信頼性を実現することができ、 組込みLinuxの適用分野が大幅に拡大することが期待できる。

開発内容

本開発プロジェクトでは、上記の3つの課題を以下のように解決する。 本プロジェクトの中心となるのが、定周期起動タスクのリアルタイム性の向上である。 それ以外にも、長期連続稼働の信頼性を向上するための改良や、 トラブル解析ツールの整備なども実施する。

1.リアルタイム性の向上

1-1 周期タスク起動精度向上

Linuxではファイル入出力、通信処理などにより、定周期のタスク起動が妨害される。 この解決策としてRT-LinuxやMontaVistaなどのリアルタイムLinuxが開発された。 しかし実際には、 RT-Linuxでは通信の優先度を考慮した複数の通信処理タスクの優先度設定ができず、 KURTやMontaVistaは、 Linux同様にファイル入出力等によりタスク切替えの遅れが発生する。

この対策として LowLatencyPatchPreEmptionPatchが提案されている。 LowLatencyPatchは、 カーネルやデバイスドライバ中に存在するタスク切替え可能箇所を試行錯誤的に見つけ、 その処理を追加するパッチである。このパッチは性能限界がはっきりせず、 デバイスによっては全くパッチをあてていない。 また、PreemptionPatchは応答速度向上のために処理の再入(プリエンプティブ) を可能にするパッチであるが、現時点では性能が十分ではない。

本開発ではこれまで重視されてこなかったデバイスドライバを含め、 リアルタイム性への阻害程度を調査し、 LowLatencyPatchやPreemptionパッチを出発点として、 割り込み禁止処理を行っている部分を明確にした上で、 絶対に必要な部分とそうでない部分を切り分け、 必要でない部分の手続きを見直し、割り込み応答性を向上させる改良を実施する。 同様に、スピンロックなどのOSが提供するサービスを使った排他制御の部分を見直し、 できるだけ細かい単位で処理の再入(プリエンプティブ)を可能にする改良を実施する。

現在のkernel-2.4.20では、20msの定周期起動タスクに対し、 FTP転送、ファイルI/O、メモリ確保/解放等の処理を実行すると、 数msから酷い時には10ms程度の遅延が発生することが明らかになっている。 リアルタイム性を確保するために、この遅延を2msec程度まで短縮することが目標である。

1-2 OS起動周期の自由な設定

リアルタイムシステムで必要となる基本起動周期(現在のLinuxでは10ミリ秒固定)を 由に設定できるように改良する。その際、OS起動周期毎にカウントアップするjiffies 変数を時間管理に参照するデバイスドライバを見直し、 OS起動周期を変更しても誤動作しないように改良する。

1-3 起動時間の短縮

デバイスのオートプローブを廃止するなどにより、トラブル時の再起動時などに、 迅速な起動(ブート)が可能になるよう改良する。

2. 信頼性の向上

数年に及ぶ安定した連続稼働を実現するためには、 現在のLinuxが抱えるいくつかの以下の課題を解決する必要がある。

2-1 メモリリークの検出

メモリリークを検出するために、 procファイルシステムと同様にメモリ情報を読み出す機能を新規に開発し、 異常検出時に発報等の動作を可能とする。

2-2 リング状ファイルシステム

長期間運転によるログファイル肥大化を防ぐために、 各ファイルが一定サイズ以上になるとリングファイルとして 古い情報から上書きされるようなファイルシステムを新規に開発する。

2-3 時刻カウンタオーバフローへの対応

Linuxカーネルおよびデバイスドライバの改良である。 OS起動周期を決めるjiffies変数(前述)を時間計算用に参照するデバイスドライバが、 497日のラップアラウンド(32bitがオーバフローしゼロに戻る)時に誤動作しないように、 jiffies変数との比較をラップアラウンドを考慮したルーチンで置き換える。

2-4 通信の冗長化

Linuxカーネルおよびデバイスドライバの改良である。二重化されたEthernet通信において、 1本故障した際のシステム再起動時に、その故障デバイスの初期化をスキップして、 残りの正常デバイスを、通常時と同じIPアドレスで初期化するように改良する。

3. トラブル解析

一般的にMission Criticalシステムは多重系で構成される。 仮に1台が故障してもバックアップ系が制御を引き継ぐ。 故障がめったに発生しない場合においても、 一度でも発生すれば原因究明できる以下のような手段を持っておくことが重要である。

3-1 イベントログ

リアルタイム性の検証やトラブル解析に適用する。 タスク切替、シグナル、例外、割込、ボトムハーフ、スピンロックなどのイベントを、 リングバッファ状メモリにログを取る機能を新規開発する。 バイナリのログをテキストベースで可視化するツール、 イベントログからジッター(定周期性)を算出するツールも開発する。

3-2 通信ログ

Ethernet通信のパケットの全ヘッダとデータの一部に関するログを、 リングバッファ状のメモリに取る機能を新規開発する。 バイナリログをテキストベースで可視化するツールも開発する。

3-3 異常時メモリダンプ

異常発生時に別カーネルを立ち上げて、 全メモリイメージをログファイルに圧縮して書き出す機能を新規開発する。 あらかじめ物理メモリを二つに分割し、 起動時に本体カーネルの仮想記憶から見えない物理メモリに、別カーネルを置いておく。 異常発生時に自動的に別カーネルを起動し、 本体カーネルの全メモリを圧縮ファイルとしてダンプする。

3-4 オンラインデバッグモニタ

プログラム実行中に、カーネル内部を含むメモリ内容の表示・変更、逆アセンブル表示、 レジスタ表示・変更を行なうことができるツールを新規開発する。 低優先度のスレッドとして実装し、RS232Cで接続されたキャラクタ端末から、 対話的に操作/表示が可能である。

機能ブロック図
機能ブロック図

稼働環境

開発するソフトウェアは、以下の環境で動作することを想定している。

ターゲットプラットフォーム

トラブル解析ツールのホストプラットフォーム

開発体制

本プロジェクト(R2Linux)は以下の体制で開発する。

プロジェクトリーダ 曽我正信
 
三菱重工業(株)長崎研究所
開発取りまとめ、全機能の開発
小島 一元
コミュニティ担当
(株)ITO (サブリーダ 杉岡利信)
リアルタイム性の向上
(株)A&D (サブリーダ 阿部昌裕)
リアルタイム性の向上
(株)三菱総合研究所 (サブリーダ 比屋根一雄)
プロジェクト管理・広報