コンテキスト スイッチで保存されているレジスタを確認するには、Linux のどこを調べますか? たとえば、カーネル モード ドライバー コードで FP またはベクトル レジスタを使用しても安全かどうか疑問に思っています (主に x86-64 と ARM に関心がありますが、アーキテクチャに依存しない回答を期待しています)。
1 に答える
誰もこれに答えていないようですので、あえて言います。
_math_restore_cpu および __unlazy_fpu メソッドを見てください。
ここでそれらを見つけることができます:
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=math_state_restore
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=__unlazy_fpu
x86 ライク プロセッサには、FPU 状態の保存 (fnsave) と復元 (frstor) のための個別の命令があるため、OS がそれらの保存/復元に負担をかけているようです。
FPUユニットがユーザーモードプロセスで使用されていない限り、Linuxコンテキストスイッチはそれを保存しないと思います。
したがって、確実にするために、自分で(ドライバーで)行う必要があります。ドライバーで kernel_fpu_begin/end を使用してそれを行うことができますが、一般的には良い考えではありません。
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=kernel_fpu_begin
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=kernel_fpu_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 (冗談です :-))。