3

Linux カーネル smp では、pen_release 識別子がセカンダリ CPU の開始に使用されます。また、他の場所でも使用されていることがわかりました。

sysdump でその値を確認し、ラウターバッハのセットアップでそれを理解しようとしましたが、これを使用する基本的な概念を理解できませんでした。

私が理解できる限り、これは一種のロックであり、プライマリ CPU からペンを解放するまでセカンダリ CPU をループに入れるために使用されます。この理解をさまざまな方法で確認しようとしましたが、あまり得られませんでした。

誰かがこれを詳細に説明できますか?

4

1 に答える 1

3

答えはここにあります: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0425/ch04s07s01.html
プライマリ コアが起動している間、セカンダリ コアはスタンバイ状態になります。 WFI命令を使用して状態。プライマリ コアはセカンダリ コアにスタートアップ アドレスを提供し、GIC を介して通知される SGI であるプロセッサ間割り込み(IPI) を使用してセカンダリ コアを起動します。セカンダリ コアの起動は、グローバル変数 pen_release を使用してシリアル化されます。概念的には、セカンダリ コアは保持ペンにあり、プライマリ コアの制御下で一度に 1 つずつ解放されると考えることができます。

変数 pen_release は、カーネル コードによって起動するプロセッサの ID 値に設定され、起動時にそのコアによってリセットされます。プロセッサ間割り込みが発生すると、セカンダリ コアは、MPIDR レジスタを使用して、自身の ID 値に対して pen_release の値をチェックします。

セカンダリ コアの起動は、プライマリ コアと同様の方法で進行します。セカンダリ コアは MMU を有効にします。それ自体への割り込みコントローラー インターフェイスを有効にし、ローカル タイマーを調整します。cpu_online_map にビットを設定し、cpu_idle() を呼び出します。プライマリ プロセッサは、cpu_online_map の適切なビットの設定を検出し、pen_release を次のセカンダリ コアに設定できます。

詳細はこちら: http://elinux.org/images/0/00/Clement-smp-bring-up-on-arm-soc.pdf

mach-vexpress のコードを確認できます。smp の初期化のために、この順序で 4 つの関数が呼び出されます:
1) smp_init_cpus
2) smp_prepare_cpus
3)
smp_boot_secondary
次に IPI を送信します arch_send_wakeup_ipi_mask(cpumask_of(cpu));
4) smp_secondary_init
など、 Versatile_secondary_init() 関数は再び pen_release を -1 にします

これは、プライマリCPUがセカンダリを初期化/開始する方法ではありません

于 2015-01-19T12:43:33.223 に答える