今回扱うWatchdogタイマはハードウェアサポートを前提としたものだ。ハードウェアサポートのWatchdogタイマは、CPUの演算やプログラムとは独立して動いているタイマと、そのタイマが一定の値になるとCPUを強制的にリセットできる機構が組み合わさって実現される。
つまり、今回CS5536でWatchdogタイマを実装するためには、CS5536のMFGPTがある一定の値になるとシステムをリセットするように設定し、かつカーネルやユーザランドが正しく動いている限り一定間隔でタイマの更新を続けるソフトウェアを書くこと、と等価である。
NetBSDのWatchdogタイマサポートは、
- デバイスドライバ部分(glxpcib.c)はタイマーの設定と更新のためのデバイス依存の部分
- カーネルのsysmonフレームワークがその他残りのデバイス非依存の部分
今回つかうデバイス非依存のサービスはsysmonフレームワークによって提供されている。これはsrc/sys/dev/sysmon/以下で実装されているフレームワークでコンピュータのハードウェアの電源やセンサなどを扱うための一般的な機能を提供している。Watchdogタイマもsysmon/sysmon_wdog.cをつかえば、他の実装のwatchdogと同じユーザランドプログラムと協調できるようになっている。
と、ここまでで全体の大雑把に構造を理解し(たつもりになっ)てから、デバイス依存の部分をやっつけてしまうことにする。glxpcib.cの中には、デバイス依存つまりCS5536特有な操作を扱う
- MFGPTの初期設定(周波数やプリスケーラーの値)する関数
- MFGPTの動作を制御するための関数
- 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 件のコメント:
コメントを投稿