ここ

2017-08-23 12 views
2

をカーネルにユーザ空間からのポインタを含む構造体をコピーする方法を私が得る構造であり、動作するようです。 私は何をすることはこれです:ここ

ユーザ空間では、私は、ポインタのための右のメモリを割り当てて、もう一度呼び出した後、私は私がioctlの上に、それを初期化し、渡す変数struct my_struct dataを宣言し、カーネルに、私はcopy_from_user(&mydataInkernel, arg, sizeof(mydataInkernel))を呼び出しますcopy_from_user(mydataInkernel.buffer, arg + 4, mydataInkernel.size)。私は何が間違っているのか分かりませんが、うまくいきません。

最初のコピーは、mydataInkernel.bufferが指すすべてのデータもコピーしますか?

copy_from_userを使用してこれを行う方法はありますか?

更新1: 私のアーキテクチャ上のポインタのサイズは、確かに8バイト(x86_64)です。より明確にするために、私はデバイスドライバを書いています。これは、ioctlを使ってユーザ空間からカーネル空間にデータを取得する必要があるためです。だからここに私はバッファを取得するためにやろうコードは次のとおりです。

 ret_val = copy_from_user(dma_info, (ioctl_dma *)arg, sizeof(dma_info)); 
    if (ret_val) 
      printk(KERN_WARNING "COPY_FROM_USER failed !"); 
    else 
      ret_val = copy_from_user(dma_info->buffer, (ioctl_dma *)arg->buffer, dma_info->taille); 

    if (ret_val) 
      printk(KERN_WARNING "COPY_FROM_USER failed !"); 
    else 
    { 
     //Do the treatment 
    } 

そしてここでは、ioctl関数のプロトタイプです:

long pci_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); 

だから私は私の第二copy_from_userも正しいとは思いませんキャスト後。

Nb:dma_infoは、上記で定義した構造体の型です。

答えて

3

初期構造体がコピーされている場合は、arg + 4のようなゲームではなく、なぜcopy_from(arg-> buffer、....)できませんか?

コードが表示されていないため、確かに言い難いが、おそらく問題は上記にある。 'buffer'のオフセットは、ではありません。 x86_64を前提としたアラインメント要件のため8です。

はそれを明確にするために:

  1. コピーをローカルオブジェクトから
  2. は、バッファサイズが正気に見えることを確認
  3. 別のものを作成する(例えば、それはあなたが期待するとき、サイズはメガバイトではありませんのみキロバイト)ローカルオブジェクト。バッファに十分なメモリを割り当て、ローカルオブジェクトに割り当てます。
  4. バッファのアドレスを手順1で作成したコピー(localobj-> bufferなど)からコピーしてコピーします。
+0

ありがとうございます。私は質問を更新しました。私はそれが今より多くの情報を与えることを望む。 – manabinto