SMMUを使用してLinuxで作成されたaarch64ページテーブルの共有[閉じる]

SMMUを使用してLinuxで作成されたaarch64ページテーブルの共有[閉じる]

現在、ザイリンクス Zynq Ultrascale+ ボード上の Linux arm64 で共有仮想アドレス空間を作成しています。将来的には、組み込みのARM SMMU 500(IOMMU)とキャッシュコヒーレンシインターフェイス(CCI)を活用して、ユーザー操作なしでCortex A53とFPGA間でポインタ/アドレスを共有できるようにする必要があります。

これを行うには、Linuxカーネルv4.14.0のドライバ/iommu/arm-smmu.c iommuドライバを使用し、それを修正して、ほとんどの仮想化抽象化とは別のカスタムカーネルモジュールとioctlを削除しました。したがって、各プロセスには、独自のaarch64ページテーブルを含む独自のSMMUコンテキストライブラリがあります。割り当てられたページを同じ仮想アドレスに手動でマップすることで、別のページテーブルを使用して仮想アドレスを持つFPGAからデータを正常に読み書きできます。

MMUとSMMUが同じページテーブルを共有できる場合は、より便利です。したがって、2 番目の冗長ページテーブルを不必要に設定することを避けることができます。そのため、以下のように変更しました。

  • 39ビットVAサイズと40ビットPAサイズ(4KBページサイズ)を使用するようにSMMUを構成する

  • 現在task_structからPGDポインタを取得し、正しいSMMUコンテキストライブラリPGD(TTBR)エントリに渡します。

他のすべてのSMMUハードウェア構成はarm-smmu.cと同じです。

しかし、これは非決定的な動作を引き起こす。 FPGAが複数の値を読み取り、共有仮想アドレスを使用してそれらを別の場所に書き換えるテストケースは、時には機能します。必要なすべてのデータ構造を設定して初期化した後、FPGAに値の転送を指示する前に意図的に一時停止するようにテストプログラムを実装しました。一時停止時間が長いほど、より多くの値が正しく送信されます。約10秒間一時停止した後、テストは常に正常に終了します。私にとって、これはLinuxで生成された更新されたページテーブルエントリ(PTE)がまだCPUキャッシュにあり、SMMUが無効なページテーブルエントリにアクセスして転送が失敗するキャッシュの問題のように聞こえます。 SMMU)変換エラー/誤動作)。したがって、Linuxソースコードの正しい場所でキャッシュをフラッシュ/クリーンアップするか、一部のSMMUフラグ(コンテキストライブラリ、ストリーム2コンテキストレジスタ...)、MMUフラグ、またはPTEのメモリ/共有可能フラグを変更する必要があります。

SMMUのMAIR設定が異なることがわかりました。私はMMUのMAIRと一致するようにSMMUコードを変更し、必要なときに正しいメモリ属性インデックスを使用しました。しかし、それはうまくいきませんでした。また、ARM SMMU v2アーキテクチャ仕様の1.5.2章「ARMアーキテクチャとSMMU変換方式の違い」を確認しました。

最も混乱しているのは、手動で構築したページテーブルはうまく機能しますが、Linuxで生成されたページテーブルが説明されている非決定的な動作を引き起こすことです。

Linuxで生成されたページテーブルを使用/共有するためにSMMUを正しく設定する方法、またはLinuxがSMMUと正しく機能するようにページテーブルを構成する方法を変更する方法についてのヒントやヒントはありますか?

ベストアンサー1

おすすめ記事