ARM で基本的なハイパーバイザーを開発しています (ボード Arndale Exynos 5250 を使用)。Linux(ubuntuまたはsmth else)/ Androidをゲストとしてロードしたい。現在、Linaro ディストリビューションを使用しています。
私はほとんどそこにいます。最後の問題を除いて、大きな問題のほとんどはすでに対処されています.FDTまたはカーネルコマンドラインを解析する前に、カーネルが上書きしようとしないように、ハイパーバイザー用にメモリを予約します。
問題は、Linaro ディストリビューションの U-Bootが R2 の FDT を Linux カーネルに渡すことですが、カーネルはハイパーバイザーのメモリを上書きしようとしてから、FDT でそのメモリ領域を予約していることを確認します(DTB を逆コンパイルし、DTS を変更し、再コンパイルします)。カーネルのコマンドライン パラメータを変更しようとしましたが、カーネルがメモリの予約済み部分を上書きしようとした後に解析されます。
したがって、私が必要とするのは、ハイパーバイザーのコードを配置する物理 RAM 内の安全なメモリの場所です。これにより、Linux カーネルは、FDT またはカーネル コマンド ラインを解析する前にアクセス (r/w) を試みません。
コンテキストの詳細:
- Exynos 5250 のシステム RAM レイアウトは次のとおりです。物理 RAM は0x4000_0000 (=1GB)から始まり、長さは0x8000_0000 (=2GB)です。
- Linux カーネルは (U-Boot によって) 0x4000_7000にロードされ、サイズ (圧縮されていない uImage) は 5MB 未満で、エントリ ポイントは0x4000_8000に設定されています。
- uInitrdは0x4200_0000にロードされ、サイズは2MB未満です
- FDT ( board.dtb ) は0x41f0_0000 (R2 で渡される) にロードされ、サイズは35KB未満です。
- 現在、ハイパーバイザーを0x40C0_0000にロードしており、そのアドレスから始まる 200MB ( 0x0C80_0000 )を予約したいのですが、FDT またはコマンドラインで確認する前に、カーネルがそこに書き込もうとします (ステージ 2 HYP トラップがそれを教えてくれます) 。領域が実際に予約されていること。代わりに、ハイパーバイザーを0x5000_0000にロードすると (元の DTB やコマンド ラインを変更しなくても)、上書きされません!
- FDT は、 ATAGを介さずに直接渡されます。
ハイパーバイザーを0x5000_0000にロードするとき、カーネルはそれをまったく上書きしようとしないため、FDT/コマンドラインを解析する前に Linux が触れないメモリ領域があると思います。これが正しいかどうか、また正しい場合は、これらのメモリ領域に関する詳細を知る必要があります。
ありがとう!
関連する質問:
次の優先順位を知っている人はいますか: ATAGs / kernel-command line / FDT ? たとえば、カーネル コマンド ラインを介してメモリを予約し、FDT (.dtb) では予約しない場合、それは機能するはずですか、それともコマンド ラインがFDT によって上書きされますか? これら3つの間に何らかの連結がありますか?