2012-04-03 1 views
2

カーネルがprocfs経由でユーザーに書き込むときはいつもcopy_to_userが必要だと思っていました。procfsでcopy_to_userが必要ですか?

(私はsnprintfを使用していましたが)一度やって忘れて、すべてうまくいきました。今私はそれに気づいた、私は探している。私はthis linkが他のセクション(ユーザーからのカーネル読取り)にはが必要であるとは言わないことがわかりました。それはcopy_from_userが必要です。

カーネルスペースに既にデータを書き込むために、カーネルモジュールに提供されているバッファー(ユーザーが読み込むようにしています)はありますか? procfsで書き込むときにcopy_to_userが必要ないのは本当ですか?または私はクラッシュしないように幸運でしたか?

+0

実際のコードを確認するのは難しいです。私は、バッファが読み込まれるときに、procfs機構によってcopy_to_userの部分が実行されたと考えています。 – stsquad

+0

@stsquad、それも私の疑惑でしたが、私はそれに驚いていました。カーネルが 'copy_to_user'を実行すると、なぜそれが存在するのでしょうか? – Shahbaz

答えて

2

ユーザスペースポインタを扱うときは、常にcopy_from_usercopy_to_userを使用してください。たとえ単純なmemcpyがあなたのために働くことがあっても、失敗する可能性があります。情報については、thisスレッドを参照してください。

についてprocfsについて言えば、カーネルメモリを事前に割り当てて少しトリックを使用することを考慮する必要があります。詳細については、thisリンクを参照してください。

+0

ありがとう!/procリーダーへのリンクは本当に役に立ち、議論はかなり面白いです – Shahbaz

+0

FYI、 'copy_to_user'はいつも私のために失敗しました。 'char str [7] =" ABCDEF "のような単純なケースでは、 ret = copy_to_user(page + offset、str、7); '常に' 7'を返しました。問題は、私が指摘した同じコードによれば、私は本当にユーザーポインタを取得しないということですが、私はいつも 'copy_to_user'がカーネルポインタを理解し無視すると思っていました。それにもかかわらず、カーネルは明示的に 'copy_to_user'自身を呼び出すので、私はそれを強制的に削除しなければなりませんでした。 – Shahbaz

関連する問題