4

コード部分 (カーネル モード) で、他の誰も CR0 レジスタを変更/チェックできないようにする必要があります。1 プロセッサのシステムでは、割り込みを無効にするのが最善だと思います。ただし、マルチプロセッサ システムでは:

  • コード セクション中にすべてのプロセッサからのすべての割り込みを無効にする方法はありますか (スピンロック メカニズムなどを使用)。

  • これは必要ですか?マルチプロセッサ システムでレジスタを変更する場合cr0、レジスタは現在の CPU に対してのみ変更されると思いますか? --> では、現在の CPU に対してのみ割り込みを無効にするだけで十分でしょうか? --> (同じシステム上の) 他の CPU から別の CPU のレジスタをチェック/変更する方法はありますか?

あなたの答えに感謝します(おおよその英語で申し訳ありません)

ジェローム。

4

2 に答える 2

2

ジェローム、

spin_lock_irqsave()と の使用を検討しましたspin_unlock_irqrestore()か? これにより、ローカル割り込みが無効になります。

より包括的なバージョンはspin_lock_irq()spin_unlock_irq()すべての割り込みを無条件に停止する ( のようにcli()/sti()) であると思います。

これらのロック メカニズムを使用する場合、考慮すべき多くの条件があります。主な例の 1 つはsleepspin_lock. 特定のケースでどちらが最適かを判断する前に、少し調査する必要があるかもしれません。しかし、あなたが提供した簡単な説明から、上記の 2 つのスキームのいずれかが機能するはずです。

幸運を!

于 2011-02-09T14:55:52.583 に答える
1

あなたはそこにたくさんの質問をしました、私はそれらに順番に答えようとします:

いいえ、通常、コードのセクション周辺のすべてのプロセッサですべての割り込みを無効にする簡単な方法はありません。ただし、それを行う必要はほとんどありません。ほとんどの場合、コードが別の CPU で実行されないようにするだけでなく、現在の CPU での割り込みも防ぐことができます。これは、spin_lock_irqsave() で実現できます。

通常、ロックを行う必要のないレジスターを変更するには、レジスターをアトミックに変更できます。レジスタを変更し、何かを行ってからレジスタを元に戻す場合は、そのシーケンス周辺の割り込みを無効にする必要がある場合があります。

一般に、システム内の別の CPU のレジスタを確認する方法はありません。カーネルがこれを行う方法は、他の CPU にそのレジスタをメモリに格納するように要求することです。

注意すべきことの 1 つは、最近の CPU では一部のレジスタがコアごとにある可能性があることです。コア上の複数のスレッド間で共有されます。

CR0最後に、x86について話していると仮定します。それは古いレジスタを変更するようなものではありません。自分が何をしているのかを本当に知る必要があります:-)

于 2011-02-10T12:37:05.607 に答える