を使用して2つのPAGESIZEバッファを割り当てる文字ドライバを構築しました
dma_alloc_coherent()
現在、これらのBUFFER [src_ptr&dest_ptr]の物理アドレスを
ioctl()
assource_offset
とを使用してユーザースペースに渡していますdest_offset
。ユーザースペースでは、このoffesetはmmap呼び出しのオフセットとして使用されます。したがって、同じ/devファイルで/dev/250と言うと2つのMMAP呼び出しを行っています
usr_src_ptr= mmap(0,page_size, PROT_READ|PROT_WRITE, MAP_SHARED,dev_FD, src_offset ); if (usr_src_ptr == MAP_FAILED){ printf("USR[UPP]:SOURCE MMAP FAiled \n\n"); close(dev_FD); exit(-1); }else{ printf("USR[UPP]:SOURCE MMAP is %X..\n",usr_src_ptr); } usr_dest_ptr= mmap(0,page_size, PROT_READ|PROT_WRITE,MAP_SHARED, dev_FD,dest_offset ); if (usr_dest_ptr == MAP_FAILED){ printf("USR[UPP]:DEST MMAP FAiled \n\n"); close(dev_FD); exit(-1); }else{ printf("USR[UPP]:DEST MMAP is %X..\n",usr_dest_ptr); }
私はユーザースペースに書き込み
0x77
、ユーザースペースとカーネルスペースにuser_src_ptr
印刷 しています。ユーザースペースとカーネルスペースの両方について正しいデータを取得しますuser_src_ptr
dest_src_ptr
私はカーネル空間で書い
0x55
ています& カーネル空間とユーザー空間でdest_ptr
印刷しています。この場合、たとえばカーネルバッファ で正しいデータを取得しますが、宛先のユーザースペースバッファは常にを返します。つまり、私が書き込んだデータ。dest_ptr
usr_dest_ptr
0X55
dest_ptr
0x77
usr_src_ptr
mmap()
異なるオフセットで同じファイルに対して2つの操作を実行できるかどうか、誰か教えてもらえますか?
それ以外の:
if ((ret = remap_pfn_range(vma,vma->vm_start,
(virt_to_phys((void *)src_ptr) >> PAGE_SHIFT),
size,vma->vm_page_prot)) < 0) return ret;
正しいものは次のとおりです。
if ((ret = remap_pfn_range(vma,vma->vm_start,
vma->vm_pgoff,
size,vma->vm_page_prot)) < 0)
あなたの入力をありがとうBЈовић....