2016-11-20 14 views
0

私は次の関数呼び出しとしてmmapを介して、いくつかのメモリを割り当てるしています:私のシステムでは、カーネル空間でcopy_to_userがカーネルからmmapユーザーにデータをコピーできませんでしたか?ユーザ空間プログラムの開発で

void *memory; 
int fd; 
fd = open(filepath, O_RDWR); 
if (fd < 0) 
    return errno; 

memory = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0); 
if (memory == MAP_FAILED) 
     return -1; 

//syscall() goes here 

は、私は次のようにメモリマップされた領域にデータをコピーしようとしています呼び出し:

copy_to_user(memory,src,4096); 

編集:私はそれは常に成功したmemory = malloc()を行っているかのに対し、明確 copy_to_user()コールのためのポストにコードをチェック追加のエラーを繰り返し、この場合には失敗しています。

この場合、mmapの権限フラグが間違っていますか?

+0

エラーは何ですか? [perror()](http://man7.org/linux/man-pages/man3/perror.3.html)を使用していますか?あなたが実際に書いたものだけであなたを助けることはできません。 – Stargateur

+0

カーネル空間のcopy_to_user()は、 'perror()'によって予測できる 'errno'を設定していません。 – bawejakunal

答えて

-1

オープンは成功しますか? mmapはどうですか?ターゲットファイルは十分に大きいですか?あなたはユーザー空間のマッピングを通してファイルに書き込めますか?

また、繰り返し4096があなたのコードが間違っています。ユーザー空間は代わりに予想されるサイズを渡す必要があります。

+0

ターゲットファイルが新しく作成されました。ファイルに書かれていますか? open()コールは確実に成功し、4096は表現目的のためだけに繰り返されません。 – bawejakunal

+0

mmapはどうですか(どのようにチェックしますか?特にMAP_FAILEDをテストしていますか?)。ファイルが0サイズであると思われます。これはcopy_to_userが機能しないようにします。私はマッピングを介したライティングについての質問とは何かが分かりません - 記憶[0] = 'A'などこれが完了すると、SIGBUSがcopy_to_userとは何の関係もないことを明確に示すようになります。 –

+0

編集を確認してください – bawejakunal

関連する問題