2007年12月21日金曜日

NetBSDでWatchdog timerを使う(for ALIX) (2)

今回扱うWatchdogタイマはハードウェアサポートを前提としたものだ。ハードウェアサポートのWatchdogタイマは、CPUの演算やプログラムとは独立して動いているタイマと、そのタイマが一定の値になるとCPUを強制的にリセットできる機構が組み合わさって実現される。
つまり、今回CS5536でWatchdogタイマを実装するためには、CS5536のMFGPTがある一定の値になるとシステムをリセットするように設定し、かつカーネルやユーザランドが正しく動いている限り一定間隔でタイマの更新を続けるソフトウェアを書くこと、と等価である。
NetBSDのWatchdogタイマサポートは、

  • デバイスドライバ部分(glxpcib.c)はタイマーの設定と更新のためのデバイス依存の部分
  • カーネルのsysmonフレームワークがその他残りのデバイス非依存の部分
の2層にわかれている。これはハードウェアを扱うデバイスドライバとOSのサービスが協調して動作する機構の一般的な構造だ。ユーザランドへのAPIやサービスの共通的な手続きはデバイスが提供する機能を一般化・抽象化して扱っておき、具体的なデバイスの処理はその抽象的なアクションから呼び出されるデバイス依存のデバイスドライバ部分のコードが対応することになる。基本的にハードウェアデバイスはデバイス毎に設計も扱い方も違うけれど、共通部分をうまく切り出しておけばデバイス依存・非依存部分をきれいに分離できる、というわけだ。

今回つかうデバイス非依存のサービスはsysmonフレームワークによって提供されている。これはsrc/sys/dev/sysmon/以下で実装されているフレームワークでコンピュータのハードウェアの電源やセンサなどを扱うための一般的な機能を提供している。Watchdogタイマもsysmon/sysmon_wdog.cをつかえば、他の実装のwatchdogと同じユーザランドプログラムと協調できるようになっている。

と、ここまでで全体の大雑把に構造を理解し(たつもりになっ)てから、デバイス依存の部分をやっつけてしまうことにする。glxpcib.cの中には、デバイス依存つまりCS5536特有な操作を扱う
  • MFGPTの初期設定(周波数やプリスケーラーの値)する関数
  • MFGPTの動作を制御するための関数
  • sysmon_wdogとインターフェイスするための関数群
を実装をしなければならない。sysmon_wdogから呼び出される関数はsysmon/sysmonvar.hの中のsysmon_wdog構造体を参照するとわかる。

struct sysmon_wdog {
const char *smw_name; /* watchdog device name */

LIST_ENTRY(sysmon_wdog) smw_list;

void *smw_cookie; /* for watchdog back-end */
int (*smw_setmode)(struct sysmon_wdog *);
int (*smw_tickle)(struct sysmon_wdog *);
u_int smw_period; /* timer period (in seconds) */
int smw_mode; /* timer mode */
u_int smw_refcnt; /* references */
pid_t smw_tickler; /* last process to tickle */
};

関数ポインタであるsmw_setmode()とsmw_tickle()を実装してやれば、sysmon-wdogで扱えるwatchdogタイマになるだろう、という見通しを立てて進めていく。

次のエントリーでデバイス操作について説明してみる予定。

0 件のコメント: