2017-01-12 2 views
2

私はLinuxカーネルモジュールを開発しました。浮動小数点定数を使用する必要があります。私は最近、カーネルモジュールの浮動小数点レジスタの使用を無効にするために必要な、カーネルビルドに遭遇しました。浮動小数点定数を使用しない浮動小数点定数(Linuxカーネルモジュール)

浮動小数点演算の全体は時間をコンパイルすることができ、私が最後に必要なのは、特定の浮動のメモリ内のバイナリ等価あるヒープに変数を持つことです(変数の宣言された型は無関係です)。たとえば、

const float fval = 3.8 * 0.98/1000.0; 
const int * const iptr = (const int *)&fval; 
const int ival = *iptr; 

私は達成しようとしていることをうまくはっきりと説明します。基本的には、コンパイル時にこれらのステップを実行して、ヒープ上に変数ivalを持つようにする必要がありますが、コンパイルされたコードに浮動小数点レジスタを使用する必要はありません。

これまでの私のハック解決策は、表現する必要のあるさまざまな浮動小数点定数値に対して上記のコードを実行してから、その整数表現を自分のモジュールコードに手動で転記することでした。

より明確に表現されています(実際には、ある意味で浮動小数点を使用する必要があります...コンパイルされたモジュールで浮動小数点レジスタを使用する必要はありません)。

float val = 3.1415926; 

をそして、それは次のようにメモリに格納されるだろうとします:私は持っていると仮定し

が浮動でコンパイルすることなく、0xDA0F4940と、ヒープ上のメモリ領域を埋めるために、コンパイラを取得する方法はあります0xDA0F4940ポイント操作ですか?

+1

一般的なガイドラインとして:カーネルコードに浮動小数点を使用しないでください。 FPを使って行うことはできませんが、FPなしでは実行できません。 –

+1

プリプロセッサは浮動小数点では機能しません。しかし、あなたの投稿されたCコードは、0以上の最適化レベル> 0で必要なフォームに最適化する必要があります(レジスタや操作なし、初期化された変数のみ)。それを試して、生成されたアセンブリを見てください。 –

+0

XY問題。浮動小数点なしで一緒に行くための簡単で明白な方法があります。一般的な数学を適用する。そのコードは未定義の動作を呼び出します。また、ヒープには何も割り当てられていません。 – Olaf

答えて

2

どのようにこのようなものの使用方法について:

union val { 
    float fval; 
    int ival; 
}; 

static const union val my_val1 = { .fval = 3.8 * 0.98/1000.0 }; 

int *vp = whatever; 
*vp = my_val1.ival; 

static constの使用は、実行時に浮動小数点演算を防ぐのに十分であるべきだが。

+0

うまくいけば、これはトリックを行います。そして、私が実際に意味していた "プリプロセッサ"の使用を、 "ランタイムの前のいつでも"解釈することに感謝します。 –

+0

申し訳ありませんが、私はこれが私が必要としていたものであることを確認しました。 浮動小数点レジスタを使用せずに浮動小数点型の代入やコピーを行うことさえできないことに驚いていました(しかしそれほど高くありません)。 「static const float val1 = 3.1415; float val2 = val1;」のようなものでも は許可されていませんでした。 もう一度おねがいします! –

関連する問題