2

PCIデバイス、そのLinuxドライバー、およびユーザースペースアプリケーションがあります。アプリケーションmmapは、ドライバーを介したPCIデバイスの最初のBARです。すべてのアクセスは32ビット整数を介して行われます。レジスタへの読み取り/書き込みには副作用(操作の開始など)がある可能性があるため、これは重要です。

x86プラットフォームでは、これは非常にうまく機能します。ただし、ARMプラットフォームに移行したばかりで、奇妙な動作があります。

  • ドライバからの読み取り/書き込みは正しく動作します
  • ユーザースペースからの読み取りにより、64バイトのPCI読み取り要求がトリガーされます。これは、32ビットアクセスのみを受け入れるため、デバイスでは実行できません(+副作用のため、これは望ましくありません)。

問題は、mmapが一部のデータをプリフェッチして、この64バイトの読み取りを発行することだと思います。ある種のmmapプリフェッチを無効にする可能性のあるフラグなどがありませんか?

ドライバー側での現在のmmapの実装は単純です

vma->vm_flags |= VM_RESERVED;
remap_pfn_range(vma,vma->vm_start,  pfn, Size_UL, vma->vm_page_prot)
4

1 に答える 1

3

私は解決策を見つけました!

同僚が示唆したように、64バイトはキャッシュラインです。これは、mmap()中に失われるため(x86では保持されますが...)、「プリフェッチ不可能な」情報を無視するキャッシュメカニズムである可能性があります。キャッシュを防ぐために、これらのフラグをvmaに追加する必要がありました。

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot) | L_PTE_PRESENT |
                         L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY;

すべてのフラグが必要かどうかは実際にはわかりませんが、機能します。

于 2012-10-17T08:21:46.113 に答える