math.hをインクルードする方法#include< math.h>カーネルソースファイルに?

StackOverflow https://stackoverflow.com/questions/1012742

  •  06-07-2019
  •  | 
  •  

質問

Linuxカーネルモジュールにmath.hを含めようとしています。使用する場合、

#include '/usr/include/math.h'

これらのエラーが表示されます:

error: features.h: No such file or directory
error: bits/huge_val.h: No such file or directory
error: bits/mathdef.h: No such file or directory
error: bits/mathcalls.h: No such file or directory

これはなぜですか?

役に立ちましたか?

解決 11

専門家の見解では、カーネル空間とユーザー空間の間でデータを通信するための良いアプローチではありません。カーネルスペースで完全に動作するか、ユーザースペースでのみ動作します。

ただし、1つのソリューションでは、カーネルモジュールで read()および write()コマンドを使用して、ユーザースペースとカーネルスペース間で情報を送信できます。

他のヒント

カーネルモジュールでCライブラリを使用することはできません。これは、数学ライブラリ部分についてはさらに当てはまります。

ユーザー空間Cモジュールをカーネル空間に含めることはできません。また、これをやりたいと思っていますか?このスレッドは、 http://kerneltrap.org/node/16570 に役立ちます。カーネル内で数学関数を実行できます。 http://lxr.linux.no/ を検索してください。必要な機能に。

標準ライブラリはカーネルでは使用できません。これにはlibc、libmなどが含まれます。これらのライブラリの一部の機能はカーネル空間に 実装されていますが、一部は実装されていません。何を呼び出しようとしているのかがわからなければ、カーネルスペースでしようとしていることを行うべきかどうかを確実に言うことはできません。

カーネルがFPUにアクセスできないことにさらに注意する必要があります。これは、タスクを切り替えるときの時間を節約するためです(FPUレジスタを保存すると、コンテキスト切り替えを実行するときに不要なオーバーヘッドが追加されるため)。本当に必要な場合はカーネル空間からFPUにアクセスできますができますが、そうするときにユーザー空間のFPUレジスタを破壊しないように非常に注意する必要があります。

編集:これは警告について要約しています。 FPUは私よりもはるかに優れています。

浮動小数点演算はカーネルではサポートされていません。これは、カーネルコンテキストからユーザーコンテキストに切り替えるときに、レジスタを保存する必要があるためです。カーネルが浮動小数点を使用する場合、浮動小数点レジスタも保存する必要があり、各コンテキストスイッチのパフォーマンスが低下します。そのため、特にカーネルでは浮動小数点がほとんど必要ないため、サポートされていません。

本当に必要な場合:

  • おそらく浮動小数点サポートを使用して独自のカーネルをコンパイルできます
  • 浮動小数点演算内でコンテキスト切り替えをブロックできます
  • 固定小数点演算を使用するのが最善です。

AFAIKカーネルスペースはユーザースペースから分離されているため、ソースコードも分離する必要があります。 / usr / includeは一般的なプログラミング用です。

これは、浮動小数点演算をカーネルは、ユーザー空間コードのように単純ではありません。 これが難しいことを示唆する別のインスタンス。

さらに決定的な答えを探しています。

できません。モジュールで必要な関数を書き換えることができます。汚れていますが、動作するはずです...

コメントありがとうございます

数学関数を使用するには

プレーンCアプリケーションを作成し、カーネルソースファイルから変数を渡すことは可能ですか?したがって、Cアプリケーションは変数を計算し、情報を送り返します。

カーネルソースファイル(カーネルスペース) ---> Cアプリケーション(ユーザースペース)

                                       |

                                   <---|

カーネルソースファイル

したがって、カーネルソースコードにヘッダーファイルを含めることができます。イベントが発生した場合、Cアプリケーション(ユーザースペース)に値を渡します

詳細: HIDジョイスティックイベント(絶対x、y)を変更しようとしているので、(pow、tanなど)のような数学関数を使用して、アプリケーションによって生成される改善された場所にのみ移動できます。

したがって、hid-input.cを使用して生のイベントを取得し、変更しました。 hidカーネルモジュールを介した入力サブシステムに使用されます&#8211;

コメントを探しています

よろしく。

(多くの場合、他の重要なセクションに影響を与えずにこれらのレジスタをロックおよび保持する多くのカーネルのノウハウがなくて)カーネル内で浮動小数点レジスタを使用することはできません。カーネル内。他の多くの人がこれに言及しています。パフォーマンスはひどいものになります。したがって、math.hはカーネルモジュールには提供されません。これを受け入れて次へ進みます...

、私はまた、クレイジーな要件の犠牲者であり、他の人によって私たちに強制された完全に狂気のデザインなので、これは正当な質問です。 math.h APIの使用を減らしてパフォーマンスへの影響を最小限に抑えた後、正しいコンパイラー設定で浮動小数点エミュレーション(ソフトフロート)を使用して、浮動小数点レジスターを使用せずに必要な機能を実装できます。カーネルコードは、これらのソフトフロート設定で既にコンパイルされているはずです。

math.h 機能を実装するには、 glibc または uClibc など。これらのライブラリには両方とも、汎用の「C」があります。特別な組み込み関数またはプラットフォーム固有のタイプを使用せずに math.h を実装するlibmの実装。したがって、カーネルで正常にコンパイルする必要があります。

uClibc:上記のリンクをクリックすると、uClibcのlibmセクションに直接移動できます。

glibc:glibcに「git」を入力すると、glibc / sysdeps / ieee754 / flt-32で探しているものが見つかります。

glibcは、より洗練されており、内部に相互依存関係があるため、理解しにくいかもしれませんが、uClibcは(現時点では)C89 math.hのみを提供します。 C99 +のように単精度(読み取り:高速)または複雑な数学機能が必要な場合は、glibcを調べる必要があります。

一重引用符の代わりに二重引用符(&quot;)を使用してみますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top