2017-03-13 15 views
-5

私はループ内でcopy_to_user()を使ってみました。カーネルプログラムでcopy_to_user()を使うには?

for_each_process(p) { 
    copy_to_user(buf, "data of p", len); 
} 

しかし、私が得た出力は異なります。これは、ユーザ空間内の最後のデータ行のみを有する。

#Data expected to copy to user space 

123 1234 12 21 
1243 124 423 12 
1234 422 42 423 

#Current Output: 
1234 422 42 423 

各行をカーネルスペースからユーザースペースにコピーするにはどうすればよいですか?

+3

コードを表示してください。私たちをあなたが思っていることに導く代わりに(それは完全に間違っているかもしれません)、私たちにコードを示し、私たち自身の結論に至らせてください。是非、あなた自身の評価をしてください。また、調査して確認するデータ(コード)を教えてください。 – kaylum

+2

"*私は、' copy_to_user() '*に渡されるデータがあると思っていました。いいえ、Linuxの 'copy_to_user(src、dst、len)'は、あなたが指している(ユーザプロセスのアドレス空間の)dstにデータをコピーします。同じポインタで複数回呼び出すと、その場所にある既存のデータを上書きします。 – dhke

答えて

5

カーネルプログラムで何回copy_to_user()を使用できますか?

必要な回数だけしかし、彼らは理にかなっている必要があります(あなたが何らかのプログラムで何かするのは理にかなっているからです)。

copy_to_user()に渡されたデータがデータを次の行に追加すると思っていました。

いいえ、copy_to_userには何も追加されません。私はあなたがそのアイデアをどこに持っているかは分かりません。実際さて、あなたはその後、第三の方法のためのデータであることを上書きし、その後、第二のプロセスのためのデータで上書きする、最初のプロセスのためにデータをコピーしている

を何が起こっている

、 等々。最後に、第3のプロセスのデータが残されます。

どのように3行すべてをカーネル空間からユーザー空間に転送するのですか?

各プロセスのデータを別の場所に格納します。

+0

どのように別の場所に保管しますか?どのように別の場所からアクセスするのですか? – Yggdrasil

+0

@ Yggdrasilそれはあなたのプログラムです。最初のパラメータ(この場合は 'buf')は、データがコピーされるアドレスです。 – immibis

関連する問題