At Thu, 25 Mar 2004 17:36:28 +0900, T.SHIOZAKI wrote: > > 余談ですが、多重割り込みをサポートしようとすると、割り込み > > コントローラを操作せざるを得なくなります。しかし、優先度 > > (splXX) の操作のたびに割り込みコントローラのレジスタに > > アクセスするとはっきりと性能に影響します。そこで、「本当に > > 割り込まれるまでは割り込みをマスクしたフリをする。割り込まれて > > から改めて割り込みコントローラを操作してちゃんとマスクする。」 > > なんてことをやります。非常に I/O の忙しい環境下では 20% 位 > > 性能に影響したりしますから侮れません。 > > まあそれは x86 の話ですね。他の多くのアーキテクチャでは > CPU 自体が割り込みレベルの判別機能を持っていて、 > この場合には CPU の制御レジスタの割り込みレベルを上げたり > 下げたりするだけですから大したコストにはなりません: > > http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/vax/include/intr.h?rev=1.14&content-type=text/x-cvsweb-markup そんなにたくさんの CPU を知っているわけではないのですが、 CPU コア自身が割り込み優先度を制御するアーキテクチャには SH3、SPARC などがありますね。 一方 ARM は割り込み要求入力が二つしかなく、優先度も固定です。 そのため NetBSD の ARM port は上記のテクニックを導入しています。 ARM の場合少なくとも StrongARM では割り込みコントローラが プロセッサコアの外部にあり(つまり write buffer が効かない)、 SA110 では更に物理的に別チップでしたし、優先度指定のできない 単なるビットマスクのセットでしたから、かなり効果的だったと思います。 私が 20% の性能向上という実測値を得たのも StrongARM 系です。 MIPS は 6 つの割り込み要因をプロセッサコアがサポート しますが、「割り込み優先度」という概念はなく各要因を個別に マスクするだけです。MIPS 系統合型 CPU の中には多数の割り込みを 外部の割り込みコントローラにカスケードしていて、プロセッサ コアに入る時には一つに絞られてしまっている例もあり、ARM と 似たような状況にあります。だから同じように効果的だと思うの ですが、NetBSD では ARM のようには実装していないですね。 > そもそも spl という仕組み自体が x86 向きではないんですね。 ええ。プロセッサ自身が割り込み優先度をサポート していないと、かなり込み入った処理が必要になります。 > CPU アーキテクチャを反映して、単に spl1 と spl0 の二つに > 相当するものしかないだけです。もちろん、BSD カーネルはこれでは > まともに動かないと思いますが(動いても遅い)、Linux は逆にそれに > 合わせて割り込みまわりを組み立ててあるわけですね。 多重割り込みは CPU が低速だったころに必要とされた技術だと思います。 CPU が高速になり、全ての割り込みが十分短時間で終了するように なってしまったので、強いて複雑な多重割り込みを導入する動機も なくなってしまったのでしょう。 // 私は Z80 の DI/EI から始めた人なので、Linux の方がとっつき // やすかったです。:-) -- Naoto Shimazaki
References:
- [linux-users:102241] Re: 組込Linuxドライバの作成方法Naoto Shimazaki
- [linux-users:102250] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- [linux-users:102289] Re: 組込Linuxドライバの作成方法Naoto Shimazaki
- [linux-users:102298] Re: 組込Linuxドライバの作成方法T.SHIOZAKI
- Prev by Subject: [linux-users:102324] Re: 組込Linuxドライバの作成方法
- Next by Subject: [linux-users:102326] Re: 動作中からのping不通
- Previous by thread: [linux-users:102324] Re: 組込Linuxドライバの作成方法
- Next by thread: [linux-users:102305] Re: 組込Linuxドライバの作成方法
- Indexes:[Main][Thread]