Linuxカーネルでの浮動小数点の使用



Answers

いくつかのカーネル設計では、「カーネル」タスクまたは「システム」タスクがタスク切り替えされたときに浮動小数点レジスタは保存されません。 (これは、FPレジスタが大きく、時間と空間の両方を節約するためです)。したがって、FPを使用しようとすると、値はランダムに「偽」になります。

さらに、ハードウェア浮動小数点スキームの中には、トラップを介して「奇妙な」状態(例えば、ゼロ除算)を処理するためにカーネルに依存するものがあり、カーネルタスクが現在実行しているよりも高い「レベル」である可能性があります。

これらの理由から、いくつかのハードウェアFPスキームは、タスクで初めてFP命令を使用するときにトラップします。 FPを使用することを許可されている場合は、タスク内で浮動小数点フラグがオンになります。そうでない場合は、実行中のチームによって撮影されます。

Question

私はRobert Loveの "Linux Kernel Development"を読んでいて、

浮動小数点の使用は簡単ではありません

ユーザー空間プロセスが浮動小数点命令を使用する場合、カーネルは整数モードから浮動小数点モードへの移行を管理します。 浮動小数点命令を使用するときにカーネルが何をしなければならないかは、アーキテクチャーによって異なりますが、通常、カーネルはトラップをキャッチして、整数から浮動小数点モードへの移行を開始します。

ユーザー空間とは異なり、カーネルは浮動小数点をシームレスにサポートすることができないため、浮動小数点をシームレスにサポートすることはできません。 カーネル内の浮動小数点を使用するには、浮動小数点レジスタを手動で保存および復元する必要があります。 短い答えは: しないでください! まれなケースを除き、カーネルには浮動小数点演算はありません。

私はこれらの "整数"と "浮動小数点"モードについて聞いたことがありません。 彼らは正確に何であり、なぜ彼らは必要なのですか? この区別は、主流のハードウェアアーキテクチャ(x86など)に存在するのでしょうか、それともよりエキゾチックな環境に特有なのでしょうか? 整数から浮動小数点モードへの移行には、プロセスの観点からもカーネルの観点からも何が必要ですか?




Links