0

x86 システムで ubuntu 12.10 32 ビットを使用しています。Linux/OSが使用できないように、デバイスとしてACPIテーブルを介して列挙および予約されている物理メモリ(約32MB、場合によってはそれ以上)があります。このメモリ デバイス用の Linux ドライバがあります。ドライバーは mmap() を実装しているため、プロセスが mmap() を呼び出すと、ドライバーはこの予約済みの物理メモリをユーザー空間にマップできます。また、VMA をセットアップし、vma->vmops を vm_operations_struct に向けて open close および fault 関数を実装する以外は、mmap で何もしないこともあります。アプリケーションが mmap されたメモリにアクセスすると、ページ フォールトが発生し、.fault 関数が呼び出されます。ここでは、vm_insert_pfn を使用して、仮想アドレスを必要な 32MB 内の任意の物理アドレスにマップします。

私が抱えている問題は次のとおりです。ドライバで、初期化中に ioremap_cache() を呼び出すと、このメモリ内のデータにアクセスするときに、アプリケーションから良好なキャッシュ パフォーマンスが得られます。ただし、ioremap_cache() を呼び出さないと、これらの物理ページにアクセスするとキャッシュ ミスが発生し、パフォーマンスが低下することがわかります。PTE を調べたところ、これらの仮想アドレス -> 物理変換の PCD ビットが設定されていることがわかりました。これは、これらの物理ページでのキャッシュが無効になっていることを意味します。vma_page_prot フィールドに _PAGE_CACHE_WB を設定しようとしましたが、新しい vma_page_prot で remap_pfn_range を使用しましたが、PCD ビットは PTE に設定されたままです。

このメモリに対してキャッシュが有効になっていることを確認する方法について、誰か知っている人はいますか? 32 MB に対して ioremap_cache() を使用したくない理由は、32 ビット システムではカーネル仮想アドレスが制限されており、それらを保持したくないためです。

4

1 に答える 1

0

提案:

  1. linux/Documentation/x86/pat.txtを読む
  2. debugpatで Linux を起動する
  3. set_memory_wb() API を試した後、 /sys/kernel/debug/x86/pat_memtype_listを確認します。
于 2013-05-26T14:22:45.740 に答える