をカーネルにユーザ空間からのポインタを含む構造体をコピーする方法を私が得る構造であり、動作するようです。 私は何をすることはこれです:ここ
ユーザ空間では、私は、ポインタのための右のメモリを割り当てて、もう一度呼び出した後、私は私が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は、上記で定義した構造体の型です。
ありがとうございます。私は質問を更新しました。私はそれが今より多くの情報を与えることを望む。 – manabinto