11

これはこの質問に関連して います。

私は Linux デバイス ドライバーやカーネル モジュールの専門家ではありませんが、Rubini & Corbet による「Linux Device Drivers」[O'Reilly] や多数のオンライン ソースを読んでいますが、見つけることができませんでした。この特定の問題についてはまだ何もありません。

カーネルまたはドライバー モジュールが浮動小数点レジスタを使用できるのはいつですか?
もしそうなら、誰がその内容を保存して復元する責任がありますか?
(x86-64 アーキテクチャを想定)

私の理解が正しければ、KM が実行されているときは常に、何らかのアプリケーション スレッドからプリエンプトされたハードウェア コンテキスト (またはハードウェア スレッドまたはレジスタ セット - 任意の名前) を使用しています。KM を c で記述した場合、コンパイラは汎用レジスタが適切に保存および復元されることを (アプリケーションと同様に) 正しく保証しますが、浮動小数点レジスタではそれが自動的に行われません。さらに言えば、多くの KM は、プロセッサに浮動小数点機能があると想定することさえできません。

浮動小数点を使用したい KM は、浮動小数点の状態を慎重に保存して復元する必要があると推測するのは正しいですか? これを行うための標準のカーネル関数はありますか?

このためのコーディング規約はどこかに明記されていますか?
それらは SMP 非 SMP ドライバーとは異なりますか?
古い非プリエンプティブ カーネルと新しいプリエンプティブ カーネルで違いはありますか?

4

2 に答える 2

11

Linus's answerは、ガイドラインとして使用するこの非常に明確な引用を提供します。

つまり、ルールは、カーネルで FP を実際に使用してはならないということです。

于 2009-09-17T08:30:14.077 に答える
8

kernel_fpu_begin()簡単な答え: カーネル コードは、使用が/で囲まれている場合、浮動小数点を使用できますkernel_fpu_end()。これらの関数は、fpu コンテキストの保存と復元を処理します。また、それらはpreempt_disable()/を呼び出しpreempt_enable()ます。これは、これらの関数間のコードでスリープやページ フォールトなどがないことを意味します。詳細については、関数名を Google で検索してください。

私の理解が正しければ、KM が実行されているときは常に、何らかのアプリケーション スレッドからプリエンプトされたハードウェア コンテキスト (またはハードウェア スレッドまたはレジスタ セット - 任意の名前) を使用しています。

いいえ、カーネル モジュールはユーザー コンテキストでも実行できます (たとえば、ユーザー空間が KM によって提供されるデバイスで syscall を呼び出す場合)。ただし、フロートの問題とは関係ありません。

KM を c で記述した場合、コンパイラは汎用レジスタが (アプリケーションと同様に) 適切に保存および復元されることを正しく保証しますが、浮動小数点レジスタではそれが自動的に行われません。

これはコンパイラが原因ではなく、カーネルのコンテキスト切り替えコードが原因です。

于 2009-01-10T16:55:12.207 に答える