1. ホーム
  2. linux

[解決済み] Linuxカーネルにおける浮動小数点の使用について

2023-03-06 09:41:53

質問

Robert Love氏の「Linux Kernel Development」を読んでいて、次のような文章に出会いました。

浮動小数点の(簡単な)使用禁止

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

ユーザー空間とは異なり、カーネルはそれ自身を簡単にトラップできないため、浮動小数点をシームレスにサポートするという贅沢はできません。カーネル内部で浮動小数点を使用するには、他の可能な雑用の中で、浮動小数点レジスタの保存と復元を手動で行う必要があります。簡単に言うと やめてください! 稀なケースを除いて、浮動小数点演算はカーネル内にはありません。

これらの "integer" と "floating-point" モードについて、私は聞いたことがありません。これらは一体何なのでしょうか、そしてなぜ必要なのでしょうか。この区別は、主流のハードウェア・アーキテクチャ(x86など)にもあるのですか?プロセスおよびカーネルの両方の観点から、整数モードから浮動小数点モードへの移行は正確に何を意味するのでしょうか?

どのように解決するのですか?

なぜなら...

  • の多くのプログラムは浮動小数点を使用しないか、任意のタイムスライスで使用しないためです。
  • FPU レジスタなどの FPU ステートの保存に時間がかかる。 そのため

...OS カーネルは単に FPU をオフにすることができます。 その結果、状態を保存および復元する必要がなくなり、コンテキスト スイッチングが高速化されます。(これは モード が意味するのは、FPU が有効であるということだけです)。

プログラムが FPU 操作を試行すると、プログラムはカーネルにトラップし、カーネルは FPU をオンにし、すでに存在しているかもしれない保存された状態を復元し、その後 FPU 操作を再実行するために戻ってきます。

コンテキスト スイッチ時に、それは実際に状態保存ロジックを通過することを知っています。(そして、FPU を再びオフにすることがあります)。

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

カーネル は自分自身にトラップすることができ、多くのものに対してそうします。(タイマ、ページフォルト、デバイス割り込み、その他) 本当の理由は、カーネルは特に を必要としないからです。 FPU ops を特に必要とせず、また FPU を全く持たないアーキテクチャ上で実行する必要があるからです。したがって、常に他のソフトウェア ソリューションがある操作を行わないことで、独自の FPU コンテキストを管理するために必要な複雑さとランタイムを単に回避しています。

カーネルが FPU を使用したい場合、FPU の状態をどれだけ頻繁に保存しなければならないかに注目すると、興味深いことがわかります。 . . . すべてのシステム コール、すべての割り込み、カーネル スレッド間のすべてのスイッチなどです。たとえ、時折カーネル FP の必要性があったとしてもです。 2 を使用する必要があったとしても、ソフトウェアでそれを行う方がおそらく速いでしょう。


1. それは は大間違いです。

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