2013-01-17 11 views
7

ARM CortexでSMP linux(3.0.1-rt11)を実行しているという観測から始めて、ユニプロセッサであるA8ベースのSoC。私は、SMPサポートを無効にすることでパフォーマンス上の利点があるかどうかを知りたいと思っていました。そしてもしそうなら、それは私のドライバーと割り込みハンドラーにどんな影響を与えますか?最新(3.0.0以上)のLinuxカーネルでCONFIG_SMP、Spinlocks、CONFIG_PREEMPT間のリンクを理解する

2つの関連トピック:スピンロックとカーネルプリエンプションを読みました。私はもう少しグーグルや読書をしましたが、今回は陳腐で矛盾した答えはほとんどありません。だから私はstackoverflowしようと思った。

私の疑問/質問の起源のLinuxデバイスドライバ第3版の第5章からこのパラです:スピンロックは、その性質上、マルチプロセッサ システムでの使用を目的としてい

ユニプロセッサワークステーションが実行しているものの、プリエンプティブ カーネルは並行性に関する限りSMPのように動作し、となります。 非プリエンプティブユニプロセッサシステムがロックでスピンした場合、 は永遠に回転します。他のスレッドは、 CPUを取得してロックを解除することはできません。このため、プリエンプションが有効になっていないユニプロセッサシステム のスピンロック操作は、 を実行するように最適化されています。ただし、IRQマスキング ステータスを変更するものは例外です。プリエンプションのために、 へのあなたのコードがSMPシステムで実行されることを決して期待しない場合でも、あなたはまだ適切なロッキングを実装する必要があります。

私の疑問/質問は以下のとおりです。

a)は、デフォルトではカーネル空間でLinuxカーネルのプリエンプティブですか?はいの場合、このプリエンプションはプロセスのみに限定されていますか、または割り込みハンドラも先取りできますか?

b)Linuxカーネル(ARM)はネスト割り込みをサポートしていますか?はいの場合、各割り込みハンドラ(上半分)は独自のスタックを持つか、同じ4k/8kカーネルモードスタックを共有しますか?

c)SMP(Config_SMP)とプリエンプション(Config_preempt)を無効にすると、ドライバと割り込みハンドラのスピンロックが意味をなさないでしょうか?

d)カーネルが割り込みをどのように処理して、上半分の実行中に割り込みを発生させるか、つまり割り込みが無効にされるかマスクされますか? CONFIG_SMPなしでコンパイルされたカーネルについて

、およびCONFIG_PREEMPT ずにスピンロックは全く存在しません:

は、いくつかのグーグル後、私はこれを見つけました。これは優れた設計上の決定です。 他の誰も同時に実行できない場合は、 をロックする理由はありません。カーネルがCONFIG_SMPなしでコンパイルが、CONFIG_PREEMPTが 設定された場合

、単にどんなレースを防ぐ に十分なプリエンプションを無効にスピンロック。ほとんどの場合、プリエンプションはSMPに相当する と考えることができ、別途心配する必要はありません。

sourceにカーネルのバージョンまたは日付はありません。最新のLinuxカーネルに有効かどうか誰にでも確認できますか?

+0

これは4つの質問ですので、一緒に答えられない可能性があるので分割してください。 –

答えて

6

a)Linuxがプリエンプティブかどうかは、あなたがそのように設定するかどうかによって異なります。
CONFIG_PREEMPT。デフォルトはありません。 make configを実行する場合は、選択する必要があります。

b)割り込みはLinuxでネストします。割り込みが処理されている間は、他の割り込みはオフになります。これはARMや他の多くのアーキテクチャにも当てはまります。それはすべて同じスタックにあります。もちろん、ユーザスペーススタックは割り込みには使用されません!

c)SMPとプリエンプションを無効にすると、コード内のスピンロックは通常のスピンロックであればノーオペレーションになり、IRQスピンロック(spin_lock_irqsave/spin_lock_irqrestore)は割り込みの無効/有効になります。後者は依然として不可欠なので、彼らはあなたのコードを実行しているタスクとコード実行中の割り込みとの間の競合を防ぎます。

d) "トップハーフ"は、伝統的に割り込みサービスルーチンを指します。ドライバの上半分のコードは割り込みによって実行されます。下半分はタスク(データの読み書きなど)によって呼び出されます。割り込み処理の詳細は、アーキテクチャー固有のものです。

私は最近、特定のMIPSアーキテクチャでLinuxの割り込みと非常に緊密に連携しました。その特定のボードには、2つの64ビットワードでマスク可能な割り込みラインが128あった。カーネルはこの上に優先順位スキームを実装しました。そのため、特定の割り込みのハンドラを実行する前に、下位の割り込みを2x64ビットレジスタの更新によってマスクしました。割り込みの優先順位をハードウェアの位置ではなく任意に設定できるように変更し、/procのエントリに値を書き込んで動的に変更しました。さらに、数字のIRQ優先度の一部がタスクのリアルタイム優先度と重複するハックを起こしました。したがって、特定の範囲の優先レベルに割り当てられたRTタスク(すなわちユーザ空間スレッド)は、実行中にある範囲の割り込みを暗黙的に抑制することができました。これは、誤って動作している割り込みがクリティカルなタスクを妨害するのを防ぐのに非常に役立ちました(たとえば、コンパクトフラッシュで使用されるIDEドライバコードの割り込みサービスルーチン。システム内で事実上最優先のアクティビティになります)。とにかく、IRQマスキングの動作は、お客様が使用するカーネルを制御している場合、石ではありません。問題の

引用された文は、通常のスピンロック(spin_lock機能/マクロ)ではないIRQのスピンロック(spin_lock_irqsave)についてのみ真です。ユニプロセッサ上でプリエンプト可能なカーネルでは、spin_lockはプリエンプションを無効にするだけで済み、spin_unlockまで他のすべてのタスクをカーネルから外しておくことができます。しかし、spin_lock_irqsaveは割り込みを無効にする必要があります。