2017-02-10 9 views
0

私はこれを頑張っていますが、進歩はありません。(カーネルモジュール)のcopy_to_userにダイナミックアレイを送る方法

カーネルからユーザー空間に動的配列を送信しようとしています。静的配列はユーザ​​ー空間に簡単に送信されるようですが、動的配列に対して何か正しいことをしていないと感じました。

int a、char b [100]などの静的変数または固定変数は、 put_userまたはcopy_to_user。しかし、ポインタを渡そうとすると、システムコールは強制終了されるか、エラーが発生します。

copy_to_userを使用して動的配列を送信することはできますか? 私は何週間も自分でこれを解決しようとしてきましたが、私は助けを求めており、あなたの指導を謙虚に求めています。

ありがとうございます。ユーザ空間で

答えて

0

memcpy(&data.items, ...) 

は動作しません:これはdata_t.itemsフィールドのストレージではなく、それが指し示すだ配列を上書きします。しかしこれはまさにあなたのカーネルコードがやろうとしていることです。

代わりに、itemsが指すメモリにコピーしたいとします。あなたが最初のフィールドの値を読み取るために必要があるとして、これは、カーネル内

memcpy(data.items, ...) 
ユーザ空間で

void *user_items; 
get_user(&user_items, &from->items); 
copy_to_user(user_items, ...); 

のように見えます。

+0

返信いただきありがとうございますが、私はmemcpy [data.items、...]を理解していません。どこで使用して割り当てますか? –

+0

@SunghoHong 'copy_to_user(&from-> items、...)'は 'memcpy(&data.items、...)'と同じです。私はそれがなぜ二番目のものが間違っているのか分かり、そして最初のものがなぜ間違っているのかを類推することで分かりました。 – ephemient

+0

いいえ、カーネル内の追加メモリを 'kmalloc'する必要はありません。すでに 'items'配列があります。正しい場所にコピーするだけです。間違った場所にコピーしています。 – ephemient

関連する問題