Linuxで物理メモリへのアクセスを無効にする方法は?

Linuxで物理メモリへのアクセスを無効にする方法は?

私は組み込みシステム(XilinxのZynq. ARMv7、Cortex-A9を使用)を使用してLinuxを実行します。特定の範囲の物理メモリにアクセスできないようにする必要があります。一度カーネルスペースまたはユーザーによって誤って作成されました。信号、データの中断などを送信できますが、ハードウェアが試みます。必然ではないMMUよりも遠く進んでください。

ベアメタルモードとU-Bootでは、TLBの場所に直接アクセスでき、読み取りまたは書き込みアクセス時にデータが中断されるようにMMUを設定して、ハードウェアレベルでメモリアクセスを制限できます。 Linuxでこれをやりたいです。 mmap()でもデータの中断が発生します。

推理:

Zynqでは、2GBのアドレス空間が次の範囲に割り当てられます。可能ハードウェアレベルでは応答しません。 ARMのAXI / AMBAプロトコルは、アドレスに何もない場合でも、ホストがアドレスにアクセスしようとする試みを決して「放棄」しないことを示しています。ハードウェアに存在しないポインタを逆参照すると、チップ全体が停止します。

私は「ちょうどsudoを提供しない」または「ちょうど良いドライバを書く」ことができることを知っていますが、それはそのレベルより前にも同じです。スーパーユーザーが誤ったコーディングをした場合、データが完全に中断されるように、初期起動時にMMUのTLBを設定したいと思います。 boot.SをハッキングせずにTLBを直接変更し、APIを使用して更新したいと思います。

答え1

Linuxカーネルには、RAMとして使用する物理アドレス範囲を制限するオプションがありますが、バグのあるドライバやアクセスがこれらの範囲外になるのを/dev/mem防ぐことはできません。とにかく、ブート中にカーネルがMMUを制御するため、ブート中にMMU設定を変更しても利点はありません。 Linuxシステムが特定のメモリ範囲にアクセスしていないことを絶対に確認するには、外部制御が必要です。

あなたのアーキテクチャは、Linuxカーネルがアクセスできるものを制限する方法を提供します。信頼エリア(正確に言うと、TrustZone Plus Memory Firewall)いくつかのコーディングを実行する必要があります。幸いなことに、ZyncのTrustZoneに関するドキュメント利用可能。基本的なアイデアは次のとおりです。

  • プロセッサはSモードで起動します。この誤った 2 GB 範囲内で非セキュアアクセスをディセーブルにするには、TrustZone コントロールレジスタを設定します。
  • これが完了したら、NSモードに切り替えて通常のブートローダに分岐します。
  • Linuxがブロックされた2 GBの範囲にアクセスしようとすると、メモリバスに到達する前に要求がブロックされ、中断がトリガされます(またはキャッシュまたはプリフェッチが関連していると不正確な中断が発生します)。

最新のARMプロセッサはハイパーバイザーを実行する代替手段を提供しますが、Cortex-A9ではそれを使用できません。

関連情報