おしかりCD おしかりCD 応援中!

2006-10-05

秋の夜長のカーネルモード

最近、仕事でRTXを使っている。
RTXとは、Ardence社の製品で、Windowsにアドオンすることにより、WindowsをRTOS(リアルタイムOS)に拡張することができるというものだ。
大雑把に言えば、拡張されたWindowsはRTXの管理下になる。
リアルタイムタスクは実時間で実行され、Windows自身はカーネルも、ユーザータスクも暇なときに実行される。

もしかしたら、「RTOSってルータや家電で動いてるμITRONとかVxWorksみたいなやつでしょ。どうしてWindows?」と思われるかもしれない。
まあ、半分以上はその通りで、家電はもとより、工場などの各種機器をはじめ、航空、宇宙、軍事といった各分野の組み込み(Embedded)制御機器の多くで使われている。
しかし、設置場所・用途によっては、PCという安価な汎用品が使える、また、Windowsの豊かな描画環境で表示ができる、といったメリットが大きい場合もある。

この、RTXがすばらしいのは、
  • インストーラで簡単にインストール、削除ができ
  • リアルタイム用モジュールのロード、アンロードが動的に行え、実行も簡単
  • 開発はVisual Studioで行える
  • 浮動小数も使い放題
  • リアルタイムのネットワークプロトコルスタックを持つ
というだけでなく、
同じコードからRT用、Windowsの通常タスク用の2種類のバイナリが生成できる点だ。例え、PCIボードのI/Oメモリや割り込みが必要なプログラムでも。

RTタスクは常にカーネルモードで実行される。つまり、デバッグにはカーネルデバッガが必要だ。
まあ、最近はVMの普及で楽になったという話も良く聞くが、要はシリアルなどで繋いでリモートデバッグだ。それだけで面倒だし、(これも最近良くなったと聞くが)カーネルデバッガであるWinDbgは使いにくかった。現在においても、少なくとも、Visual Studioのデバッガよりは使いづらい。
通常タスク用のバイナリがあれば、実時間では動作しないが、時間に関係しない部分は容易にデバッグできる。

また、推奨はしていないが、RT用のCRTは例外を含めてC++をサポートしている。また、SEHさえ使用可能だ。さらに、RTXのプロセスは、全体が非ページ領域に張り付いているため、一般的なドライバ開発では鬼門と思われる仮想関数さえ使い放題だ(一般的なWindowsのドライバではページングが許可されない局面がある。vtableがメモリ上にある保障はないかもしれない)。

APIはWin32のサブセットと、Win32のプロセス間通信APIとよく似たRTのAPIを取り混ぜて使用できる。上記の通常タスクのバイナリが作れるのと同じ理屈でRTのAPIは通常タスクでも使用でき、RTタスクとの通信が可能だ。さらに、通常のドライバから(名前のプリフィックスだけ異なる)RTのAPIを呼べば、同様にやり取りができる。

問題があるとすれば、同僚がカーネルプログラムに必要な謙虚さを忘れて無茶をはじめることぐらいだ(これは大問題なんだよw)。

現在の最新バージョンは7.0だが、以前のバージョンについては簡単な手続き(EASY DOWNLOADのところ)で30日評価版が試せるようだ (私はこのフォームからは入手していない。職場で製品版を使っているので。)。
評価版については、ライセンスが30日という以外、機能に制約はない。

秋の夜長にカーネルモードプログラミングというのはどうだろう。

keywords: __programming__ | __windows__ | __embedded__ | __rtos__ | __rtx__

0 件のコメント: