6

カーネル モジュールを作成しようとしていますが、別のモジュール ヘッダーで定義されている構造体のメンバーにアクセスするのに行き詰まっています。私は説明しようとします:

他のモジュールが次のようなものであるとしましょう:

<kernel-src>/drivers/xxx/xxx.c|.h

xxx.c には、ドライバーで使用しているエクスポートされた関数がいくつかあります。ただし、 xxx.h で定義されている構造体s_xxxからメンバーm1にアクセスしたい:

struct s_xxx {
    ...
    int m1;
};

次に、これを /usr/include/linux/yyy.h に入れます。

struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};

私は私のドライバーです:

#include <linux/yyy.h>

xxxドライバーからエクスポートされたシンボルを正常に使用しています。しかし、もちろん、s_xxxから member にアクセスしようとすると、コンパイラは文句を言います:

struct s_yyy *p_yyy;
...
m = p_yyy->p_xxx->m1; /* error */

xxx.h が /usr/include/linux/ に見つかりません。これまでのところ、2 つの回避策を見つけました。

1) カーネル ソースをダウンロードし、モジュールに xxx.h へのフル パスを含める

2) s_xxx 定義を xxx.h からモジュールにコピー/貼り付けます

これを行う正しい方法は何ですか?

(長くてくだらない説明でごめんなさい:@ )

4

1 に答える 1

5
struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};

xxx.h がない場合、これは、前方宣言がstruct s_xxxあり、それへのポインターを宣言できることを意味しますが、そのサイズまたはメンバーがコンパイラーに認識されていないため、そのメンバーをまだ使用したり、インスタンス化したりすることはできません。コンパイル単位に xxx.h を含めて、完全な構造定義を含める必要があります。

xxx.h が xxx のパブリック インターフェイスの一部ではないが、それでもモジュールの内部にアクセスすることを主張している場合、xxx の内部構造が変更された場合、将来的に壊滅的な互換性が失われるリスクに直面します。

構造体の定義を独自のコードにコピーすることはお勧めできません。構造体間のバイナリ互換性が保証されないためです。同じコンパイラとオプションを使用してすべてを自分でビルドした場合を除きます。

于 2012-11-28T11:33:47.513 に答える