[解決済み] Linuxカーネルにおける浮動小数点の使用について
質問
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 の奇妙なコーナー ケースが発生すると、ソフトウェアにトラップされ、トラップ可能な演算の衒いなく正しいエミュレーションが含まれます。
関連
-
ゼロからLinuxのisoイメージを作る方法(グラフィックチュートリアル)
-
rsyncとinotfiyの組み合わせでリアルタイムバックアップ問題を実現
-
[解決済み] ビーコン待ちでハングアップしたリーバー
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] 複数のPDFファイルを1つのPDFに結合/変換する【終了】。
-
[解決済み] Linux で grep を使ってファイル名だけを表示するにはどうしたらいいですか?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み] JavaScriptで浮動小数点数の精度を扱うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linux ddコマンド詳細説明:データのバックアップ、およびバックアッププロセスでのフォーマット変換のケース
-
Linux NICがRTNETLINK answersというエラーで起動できない場合、どうすればよいですか?ファイルが存在するか?
-
ロックされたdeepinファイルを削除する方法は?deepinのロック付きファイルを削除する方法のヒント
-
Linux 5.10.10 正式版リリース:NULLポインタの不具合修正など。
-
TclError: 表示名がなく、$DISPLAY環境変数もない。
-
sudo が sudo として表示される: setuid root である必要がある
-
Apache の一般的な設定エラー
-
[解決済み] find .コマンドでディレクトリを除外する方法
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] POSIX」の意味を教えてください。