4

Windowsカーネルで使用されるCコードでdoubleデータ型変数を定義しようとしています。コードはコンパイルされますが、リンク中にエラーが発生します。ソースファイルでlibcntpr.libを使用し、コードで__fltused変数を定義してみましたが、役に立ちませんでした。誰かがこれを使用する方法について私を助けてくれるなら、私は本当に感謝します。

4

1 に答える 1

7

現在の WDK にまだ適用できるかどうかはわかりませんが、Walter Oney はドライバーでの浮動小数点の使用を推奨しています

残念ながら、問題は適切なライブラリを見つけるだけではありません。C コンパイラの浮動小数点サポートは、コプロセッサを初期化し、いくつかの例外ハンドラをインストールしてから爆破できるアプリケーション環境で動作することを前提としています。また、それ以降に発生するすべてのスレッド コンテキスト スイッチの必要に応じて、オペレーティング システムが各スレッドのコプロセッサ コンテキストの保存と復元を処理することも前提としています。

これらの仮定は、通常、ドライバーでは当てはまりません。さらに、不足しているインフラストラクチャが大量にあるため、コプロセッサ例外のランタイム ライブラリ サポートは機能しません。

基本的に必要なことは、使用するたびにコプロセッサーを初期化するような方法でコードを作成することです (KeSaveFloatingPointState と KeRestoreFloatingPointState を忘れないでください)。コプロセッサも例外を生成しないように設定します。次に、シンボル __fltused をどこかで定義して、リンカーを満たすことができます。(そのシンボルは通常、ランタイム サポートにドラッグするだけです。前述のように、カーネル モードでは機能しないため、そのサポートは必要ありません。)初期化ステップには、間違いなくアセンブリ言語コードが必要になります。

すべての浮動小数点演算を行うシステム スレッドがある場合は、スレッドの開始時にコプロセッサを 1 回初期化できます。それ以降、システムは必要に応じて状態を保存および復元します。

IRQL < DISPATCH_LEVEL でのみ浮動小数点を実行できることを忘れないでください。

とりわけ、FINITがあります。コプロセッサーのプログラミングに慣れていない場合は、これは特殊な問題であり、解決するにはかなりの研究が必要であることを経営陣に伝えることをお勧めします。次に、適切な環境で研究を行うために、1 週間程度 (つまり、ハリケーン シーズンの後) マルティニーク島に飛び立ちます。

真剣に、FINIT やその他の演算コプロセッサ命令に慣れていない場合、これはおそらくドライバに組み込むべきものではありません。

Microsoft からの興味深い読み物もあります: C++ for Kernel Mode Drivers: Pros and Cons

x86 システムでは、特に要求されない限り、浮動小数点およびマルチメディア ユニットはカーネル モードで使用できません。それらを不適切に使用しようとすると、発生した IRQL (システムがクラッシュします) で浮動小数点エラーが発生する場合と発生しない場合がありますが、ランダムなプロセスでサイレント データ破損が発生する可能性があります。不適切に使用すると、他のプロセスでデータが破損する可能性もあります。このような問題は、多くの場合、デバッグが困難です。

于 2012-10-23T13:17:03.413 に答える