川の流れのように‥(Eiji Ota's Weblog)

火曜日 5 24, 2005

ある失敗談 - Solaris10のdevfsの仕業? それとも‥

先日、テストのお話をしましたよね。今日はその時の失敗談。 実は先日のテスト中、システムでパニックが発生しました。(!) 障害修正のテスト中に、パニックでシステムダウンなんて、「ゲゲッ」っていう状態ですよね。 全く洒落になりませんもの。(^0^) テストでは、お手製のデバイスドライバー(pseudoなやつ)を作って、Solaris DDI関数の動きを調べていたんです。コマンドで調べたい装置のデバイスノードと、そのデバイスの持つregプロパティの番号を指定してやると、お手製ドライバーを通して、Solaris DDI関数の返す値が分かる‥そんな“作り”の予定でした。ところが‥。 カーネルを置き換え、いざテストを開始するとパニック発生です!  「さーっ」と血の気が引いていきます。。。 (いやぁぁぁぁ (T-T) ← こんな気持ち) 落ち込む気分をカフェの一杯のコーヒーで持ち直し(あぁぁ、なぜサンなのにJava coffeeではないのだろうかとか思いつつ)、気を取り直して、クラッシュダンプを調べてみると、ddi_ctlops()の0×20番地で%g1レジスタが0であったためにパニックしたことが分かりました。 ddi_ctlops+0×20: ldx [%g1 + 0×40], %g1 なぜ値が0なのぉ?と更に調べてみると、このドライバーはロードされているものの、まだアタッチされていないために値が0となっていたことが分かりました。 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ ここでアタッチだのロードだの書いてしまったので、ちょっと簡単に解説です。 Solaris Operationg Systemでは、ドライバーは幾つかの状態遷移を経て、(無事)使用できるようになります。 ドライバーを使うには、まずカーネルからアクセスできないといけませんよね。 それには、まず動的にロード(load)してやる必要があります。そうすると、カーネルにモジュールとして登録され、カーネル空間としてアクセス可能になるわけです。 ですが、この段階ではまだドライバーとして機能してません。機能するためには、ドライバーが装置にアタッチ(attach)されないといけません。ドライバーがある装置にアタッチされると、インスタンス番号が割り当てられます。 そしてデバイスドライバーが装置を駆動し‥ハードウェアが使えるようになって‥めでたし、めでたしと、まぁこんな感じに進むわけです。 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ テストの時はドライバーはカーネル空間からみえているものの、実際には装置をまだコントロールしていない、そんな状態だったってことになるんですね。 まぁともかく原因は分かりました。少なくとも僕の修正のせいじゃないな‥。良かったっ! (^-^)v oO (Happiness) そう思うと、ちょっと余裕が生まれてきますよね。 今回も、ちょっとした(余計な?)疑問が頭の中を駆けめぐります。。。 例えば、ddi_ctlops+0×20番地で、なぜ%g1のチェックを入れないんだろう? %g1が0の時だってあるんじゃないのぉ‥Solarisのバカやろぉーとか‥。(^-^; Solaris10にはdevfsというものがあって、装置を使いたいってオープンしにいくと、devfsが勝手にロードしてアタッチしてくれます。余計な‥と思う人もいるでしょうけど、Dynamic ReconfigurationやらPCI Hot Plugなどをサポートするサーバーでは、システム稼働中にPCIカードを引っこ抜いて交換したりするわけですから、そういう場合には、動的にデバイスノードを変更してくれるdevfsの方が都合が良いときもあったりするわけです。 すると、今度は、devfsは僕のドライバーは面倒みてくれないのか‥devfsのバカやろぉーとか(またかいっ)、なるわけでして。(^-^; 更に落ち込む気分をカフェの2杯目のコーヒーで持ち直しつつ考えてみると、そういえば、僕のドライバーでは、調べる装置をオープンしているわけではないなと気づいてしまいました。オープンしているのは、僕のドライバーで、そこから調べる装置の情報を直接取得にいって‥。あぁ、その時に装置をオープンしていないのであれば、アタッチされている保証はないわけだ‥。すると、devfsが悪いわけじゃないなぁ。。。と。 そうなんです。Solaris10では、動的にattach/detachが実行され*やすい*ので、デバイスノードにアクセスしている最中は、holdしておくことが必要なんですね。じゃぁ、どうするのっ? というところで、今度はLayered Driver I/Fに気づきました。Solaris10には、Layered Driver Interface (LDI) というのがあって、ドライバーから*別の*ドライバーをオープンして使うことができるんですね。(うん、ちょっと便利‥かも?) 「そうか、これだぁ、これが必要だったのかぁぁ」 と、気づくわけです。 で、更に落ち込む気分をカフェの3杯目のコーヒーで持ち直しつつ考えてみると、、、 「でも、関係ないじゃんっ?(笑)」 と、ようやく気づくわけです。だって、Solaris DDI関数のテストが目的ですモノね! (^-^) そして、 「このままでは、俺はカフェイン中毒になってしまうではないかっ!」 ということにも‥。 (‥コーヒー飲み過ぎ‥) こんなことをしつつ、僕のサンでの一日がまた過ぎてゆくわけです‥。

Comments:

Post a Comment:
  • HTML Syntax: NOT allowed

Calendar

Feeds

Search

Links

Navigation

Referrers