At Tue, 9 Mar 2004 21:09:51 +0900, Yoshihiro Kawabe wrote: > Naoto> その形のまま、CPU independent に抽象化されてます。 > > まぁ抽象化されているとも言えるんですが。 > > Naoto> 他にも、ISA とか PCI の切口がアーキテクチャ抽象化レイヤとして > Naoto> 使われてます。ちょっとクラっときますね。ここは。 > > そうなんですよね。感覚的には抽象化されていると言うよりは直接見えている > 様な印象を受けてしまいます。 PC から見ると非常に直接的ですよね。 ところが、PC じゃないものでも PC 的な表現のまま、CPU 非依存に なるように仕掛けがしてあるのです。例えば、inb() や outb() は PC では ISA の I/O サイクルになりますが、ARM では memory mapped I/O デバイスに対するアクセスになる、などです。マクロのトリックを 駆使して実現しています。 抽象化レイヤに抽象的な見てくれを与えるよりも、既存のデバドラを そのままマルチアーキテクチャ化する方を選んだ結果でしょう。 > 以外の使い方を sti()やcli() を使うことで出来てしまうことかと思います。 > つまり、呼び出された時の状態を無視して、割り込みを解除してしまえる、っ > てことです。 それは BSD の splxx() でも同じです。spl0() などとして低い優先レベルを 設定する(割り込みを許可する)コードはデバドラ内でも書けてしまいます。 もちろん、そんなことをすればカーネルはちゃんと動きません。 splxx() で優先レベルを下げて良い(割り込みを許可して良い) のは スケジューラだけで、デバドラは「優先レベルを上げる(割り込みを 禁止する)」と「元に戻す」しか許されません。 > でも、Linuxの場合には、 > spin_unlock_irq()などの様な状態復元を行わない関数が用意されていて多用 > されているので、問答無用に割り込みが解除されてしまいますね。 > これっていかがなものか、って思います。 以前の割り込みが許可状態だとコンパイル時に分かっている場所なら、 spin_unlock_irq() を実行して良いはずです。そうでない場所で使うのは 間違ったコードですね。 spl も同様です。splxx() は必ずその時の優先レベルより高い 優先レベルを指定しなくてはならないのですから、「優先レベルが 実行時でないと分からないような箇所では splxx() してはいけない」 ということになります。 -- Naoto Shimazaki
Follow-Ups:
- [linux-users:102224] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- [linux-users:102129] Re: 組込Linuxドライバの作成方法Naoto Shimazaki
- [linux-users:102136] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- [linux-users:102185] Re: 組込Linuxドライバの作成方法Naoto Shimazaki
- [linux-users:102205] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- Prev by Subject: [linux-users:102222] mount -t tmpfs
- Next by Subject: [linux-users:102224] Re: 組込Linuxドライバの作成方法
- Previous by thread: [linux-users:102205] Re: 組込Linuxドライバの作成方法
- Next by thread: [linux-users:102224] Re: 組込Linuxドライバの作成方法
- Indexes:[Main][Thread]