0

この関数を使用して、いくつかの構造をカーネルにコピーしています。しかし、問題は、より大きなデータ構造の一部である 3 つのデータ構造をコピーする必要があることです。注: 3 つのデータ構造は、より大きなデータ構造で連続しています。

SO、私のコピーユーザー関数では、最初のデータ構造のポインターを渡し、3 つのデータ構造すべての長さを指定します。しかし、ユーザー空間に移動して2番目のデータ構造の最初の要素を出力すると、他の値が得られます。

SO、私は何を間違っていますか。として、解決策として私は 3 つの copt_to_user 呼び出しを行いましたが、驚いたことにそれは正常に動作します。単一の copy_to_user 呼び出しを行うときの問題です。

何が原因か教えてください。

答えてくれてありがとう、それは配置の問題でしたが、さらに進んで、内部構造を埋めたい場合はどうすればいいですか..? 例-

構造d{

構造体 b;

構造体 c; //この構造をパディングしたいのですが、どうすればいいですか?

構造体 d;

}

4

1 に答える 1

2

コメントで述べたように、これは本当にアライメントの問題のようです。Gccは、おそらく構造体dの構造体a、b、cの間にパディングを追加します。ユーザーランドでインスタンス化した方法によっては、問題が発生する可能性があります。構造体で使用して、gccにパディングを生成しないように強制することもできます__atribute__ ((packed))が、この構造体がハードウェアレジスタにマップされない限り、その構造体のフィールドにアクセスするときのパフォーマンスが低下するため、通常はお勧めできません。

もう1つの考えられる問題は、カーネルが64ビットで、ユーザーランドプログラムが32ビットの場合です。この場合、同じレイアウトになるように固定サイズの型を使用する必要があります。

于 2012-07-28T15:31:04.957 に答える