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)