13

呼び出しを処理するためのデバイスドライバーモジュールと関連するユーザーライブラリを開発していioctl()ます。ライブラリは関連情報を取得し、それを構造体に配置します。構造体はドライバーモジュールに渡され、そこで解凍されてから処理されます(多くの手順を省略していますが、それが全体的な考え方です)。

ioctl()isuint32_tタイプを介して構造体を介して渡されるデータの一部。<stdint.h>そのタイプがANDで定義されていることを発見しました<linux/types.h><linux/types.h>これまで、ユーザーライブラリを含め、その値を定義するために使用してきました。しかし<linux/*.h>、ユーザースペースでライブラリを使用するのは悪い形式であることを理解しているので、ライブラリを削除して<stdint.h>代わりに使用する場合、ドライバモジュールに構造体定義が含まれている場合は、ライブラリ<stdint.h>も含める必要があります。

<linux/types.h>カーネルファイルで型を定義することがポイントだと思うので、それが使用<stdint.h>が悪い考えであるかどうかはわかりません。また、ドライバーモジュールをでコンパイルしようとすると、のすべてのインスタンスをで置き換えても(そしてそれをインクルード順序の一番上に置いて<stdint.h>も)消えない再定義に関するコンパイルエラーが発生することもわかりました。<linux/types.h><stdint.h>

  1. ユーザースペースコードにlinux/*。hインクルードを使用するのは悪い考えですか?
  2. <stdint.h>カーネル空間コードで使用するのは悪い考えですか?
  3. 両方の答えが「はい」の場合、を含む構造がuint32_tユーザーライブラリとドライバーモジュールの両方で共有されている状況をどのように処理しますか?
4

2 に答える 2

6
  1. ユーザースペースコードにlinux/*。hインクルードを使用するのは悪い考えですか?

はい、通常は。典型的な状況は、Cライブラリヘッダー(この場合はstdint.hその仲間)を使用し、それらのユーザースペースタイプを介してCライブラリとインターフェイスし、カーネルタイプを介してカーネルとの通信をライブラリに処理させる必要があることです。

しかし、あなたは典型的な状況ではありません。あなたの場合、あなたはドライバライブラリを書いています。したがって、を使用してユーザースペースへのインターフェイスを提示する必要がありますが、カーネルドライバーにインターフェイスするときはヘッダーをstdint.h使用します。linux/*.h

したがって、あなたの場合、答えはノーです。

  1. カーネル空間コードでstdint.hを使用するのは悪い考えですか?

間違いなくそうです。

参照:http://lwn.net/Articles/113349/

于 2013-01-27T11:27:01.473 に答える