94

Robert Love の「Linux Kernel Development」を読んでいて、次の文章に出くわしました。

浮動小数点を (簡単に) 使用しない

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

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

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

4

2 に答える 2

91

なぜなら...

  • 多くのプログラムは浮動小数点を使用しないか、特定のタイム スライスで使用しません。
  • FPU レジスタおよびその他の FPU 状態の保存には時間がかかります。したがって

...OS カーネルは、単純に FPU をオフにする場合があります。Presto、保存および復元する状態がないため、コンテキスト切り替えが高速になります。(これはモードの意味であり、FPU が有効になったことを意味します。)

プログラムが FPU op を試みると、プログラムはカーネルにトラップされ、カーネルは FPU をオンにし、既に存在する可能性のある保存された状態を復元してから、FPU op を再実行するために戻ります。

コンテキストの切り替え時に、状態保存ロジックを実際に通過することがわかっています。(その後、FPU が再びオフになる場合があります。)

ちなみに、カーネル (Linux だけでなく) が FPU 操作を回避する理由についての本の説明は、完全に正確ではないと思います。1

カーネルはそれ自体にトラップすることができ、多くのことをトラップします。(タイマー、ページ フォールト、デバイス割り込み、その他。) 本当の理由は、カーネルが特にFPU ops を必要とせず、FPU をまったく使用しないアーキテクチャで実行する必要があることです。したがって、他のソフトウェア ソリューションが常に存在する ops を実行しないことで、独自の FPU コンテキストを管理するために必要な複雑さと実行時間を単純に回避します。

カーネルが FP を使用したい場合、FPU の状態を保存する必要がある頻度に注目するのは興味深いことです。. . すべてのシステム コール、すべての割り込み、カーネル スレッド間のすべての切り替え。たまにカーネルFPが必要になったとしても、おそらくソフトウェアで実行した方が速いでしょう。


1. それは完全に間違っています。 2. カーネル ソフトウェアに浮動小数点演算の実装
が含まれている場合について、私が知っているケースがいくつかあります。 一部のアーキテクチャでは、従来の FPU 演算をハードウェアに実装しますが、一部の複雑な IEEE FP 演算はソフトウェアに任せます。(考えてみてください:非正規演算です。) いくつかの奇妙な IEEE コーナー ケースが発生すると、トラップできる ops のペダンティックに正しいエミュレーションを含むソフトウェアにトラップされます。

于 2012-12-14T21:54:26.870 に答える
16

一部のカーネル設計では、「カーネル」または「システム」タスクがタスクスイッチアウトされたときに浮動小数点レジスタが保存されません。(これは、FPレジスタが大きく、保存に時間とスペースの両方がかかるためです。)したがって、FPを使用しようとすると、値がランダムに「プーフ」になります。

さらに、一部のハードウェア浮動小数点スキームは、トラップを介して「奇妙な」状況(ゼロ除算など)を処理するためにカーネルに依存しており、必要なトラップメカニズムは、カーネルタスクが現在実行しているよりも高い「レベル」にある場合があります。

これらの理由(およびその他のいくつかの理由)により、タスクで初めてFP命令を使用するときに、一部のハードウェアFPスキームがトラップされます。FPの使用が許可されている場合は、タスクで浮動小数点フラグがオンになります。オンになっていない場合は、銃殺隊に撃たれます。

于 2012-12-14T21:57:24.203 に答える