2

かなりの数のアーキテクチャ (SH、ARM、X86 など) では、Linux カーネルのアイドル ループ内に次の行があります。

if(cpuidle_idle_call())
    pm_idle();

私の疑問:

少なくとも ARM では、デフォルトの pm_idle 関数は WFI (Wait for interrupt) 命令で構成されていますが、紛らわしい部分は、割り込みが無効になり、WFI 命令の実行後に有効になることです。割り込みが発生したときに CPU が WFI からオンラインに戻る方法無効 ?

さまざまなバージョンの Linux で回答を検索してみましたが、関連するコードは 2.6.32 (参照した最後のバージョン) 以降変更されていないため、何か不足している可能性が高くなります。

4

2 に答える 2

3

割り込みが無効になっていても WFI はウェイクアップしますが、ARM コアは割り込みが再び有効になるまで割り込みを受け取りません。

于 2012-12-06T20:52:50.350 に答える
2

cpuidle_idle_call() が「エラー」を返す理由はいくつかあります。

  1. CPU 用にインストールされた cpuidle ドライバーはありません。
  2. cpuidle が無効になりました
  3. ドライバーを初期化できませんでした

行方不明のドライバーは、発生する可能性が最も高いものです。しかし、この場合、カーネルは何らかの方法でサイクルを焼き尽くす必要があります。そのため、アーム上でデフォルトで default_idle にマップされる pm_idle を呼び出します。そこでカーネルは、CPU に arm_pm_idle が登録されているかどうかをチェックします。これは、軽量の cpuidle ドライバーのように考えることができます。すべてが失敗した場合、cpu_idle にフォールバックします。これは実装する必要があり、ほとんどの場合、書き込みバッファーを空にして WFI モードに入ります。

その全体には多くの冗長性がありますが、これにより、開発者は単純なアイドル ドライバーを作成し、必要に応じて後でそれらを完全に拡張された cpuidle ドライバーにすることができます。

問題は、さまざまな SoC がさまざまな機能を提供することです。たとえば、カークウッドでは、アイドル ドライバーは DDR をセルフ リフレッシュ モードに設定してから、wfi モードに切り替えて電力を節約します。理論的には、CPU をより遅いクロックに切り替えるように拡張することもできます。

あなたの他の質問のために。割り込みを無効にすると、CPU が割り込みハンドラーをトリガーするのを防ぐだけで、割り込みが発生したことを登録する必要があります。そうしないと、データが失われる可能性があります。したがって、ハンドラーは無効になりますが、着信割り込みは引き続き WFI のウェイクアップ機能をトリガーします。

于 2012-12-07T12:54:03.900 に答える