1
  1. を使用して2つのPAGESIZEバッファを割り当てる文字ドライバを構築しました dma_alloc_coherent()

  2. 現在、これらのBUFFER [src_ptr&dest_ptr]の物理アドレスをioctl()assource_offsetとを使用してユーザースペースに渡していますdest_offset

  3. ユーザースペースでは、この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);
    }
    
  4. 私はユーザースペースに書き込み0x77、ユーザースペースとカーネルスペースにuser_src_ptr印刷 しています。ユーザースペースとカーネルスペースの両方について正しいデータを取得しますuser_src_ptrdest_src_ptr

  5. 私はカーネル空間で書い0x55ています& カーネル空間とユーザー空間でdest_ptr印刷しています。この場合、たとえばカーネルバッファ で正しいデータを取得しますが、宛先のユーザースペースバッファは常にを返します。つまり、私が書き込んだデータ。dest_ptrusr_dest_ptr0X55dest_ptr0x77usr_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Јовић....

4

1 に答える 1

1

はい、例で既にわかっているように、同じプロセスで異なるオフセットを使用して同じファイルに対して mmap() を実行できます。mmap(2)のman ページには、オフセットの制限については何も書かれていません (ただし、sysconf(_SC_PAGE_SIZE) によって返されるページ サイズの倍数でなければならず、もちろんファイルを超えてはなりません)。


制限は 1 つだけです。1 つのプロセスで同じファイルを mmap() する場合、同じファイル ID を使用する必要があります。あなたの例でこれを行ったので、うまく動作します。

于 2013-01-29T12:30:13.503 に答える