3

コンテキスト スイッチで保存されているレジスタを確認するには、Linux のどこを調べますか? たとえば、カーネル モード ドライバー コードで FP またはベクトル レジスタを使用しても安全かどうか疑問に思っています (主に x86-64 と ARM に関心がありますが、アーキテクチャに依存しない回答を期待しています)。

4

1 に答える 1

6

誰もこれに答えていないようですので、あえて言います。

_math_restore_cpu および __unlazy_fpu メソッドを見てください。

ここでそれらを見つけることができます:

x86 ライク プロセッサには、FPU 状態の保存 (fnsave) と復元 (frstor) のための個別の命令があるため、OS がそれらの保存/復元に負担をかけているようです。

FPUユニットがユーザーモードプロセスで使用されていない限り、Linuxコンテキストスイッチはそれを保存しないと思います。

したがって、確実にするために、自分で(ドライバーで)行う必要があります。ドライバーで kernel_fpu_begin/end を使用してそれを行うことができますが、一般的には良い考えではありません。

なぜそれは良い考えではないのですか?Linus 自身から: http://lkml.indiana.edu/hypermail/linux/kernel/0405.3/1620.html

引用:

x86で「安全に」実行できます

kernel_fpu_begin(); ... kernel_fpu_end();

そして、すべての FP がこれら 2 つの間にあることを確認し、障害やスリープの可能性があることを何も行わないようにします。

kernel_fpu_xxx() マクロは、プリエンプションがオフになっていることなどを確認するため、上記は常に安全です。

もちろん、それでももちろん、カーネルで FP を使用すると、実際に FPU があることが前提になり ます。カーネル内 FP エミュレーション パッケージは 、カーネル FP 命令で動作することは想定されていません。

ああ、そしてカーネルは libc とリンクしていないので、少しでも凝ったものを使うことはできません。関数呼び出しなしで、gcc がインラインで実行できるものでなければなりません。

つまり、ルールは、カーネルで FP を実際に使用してはならないということです。 それを行う方法はいくつかありますが、特に MMX/XMM 作業を行う場合など、いくつかの実際の特殊なケースに対応する傾向があります。つまり、唯一の「適切な」FPU ユーザーは、実際には RAID チェックサム MMX スタッフです。

ライナス

いずれにせよ、本当に Intel の浮動小数点ユニットに頼りたいですか? http://en.wikipedia.org/wiki/Pentium_FDIV_bug (冗談です :-))。

于 2010-06-09T16:27:16.993 に答える