0

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つの間に何らかの連結がありますか?

4

2 に答える 2

0

As per https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm/Booting, safe locations start 128MB from start of RAM (assuming the kernel is loaded in that region, which is should be). If a zImage was loaded lower in memory than what is likely to be the end address of the decompressed image, it might relocate itself higher up before it starts decompressing. But in addition to this, the kernel has a .bss region beyond the end of the decompressed image in memory.

(Do also note that your FDT and initrd locations already violate this specification, and that the memory block you are wanting to reserve covers the locations of both of these.)

Effectively, your reserved area should go after the FDT and initrd in memory - which 0x50000000 is. But anything > 0x08000000 from start of RAM should work, portably, so long as that doesn't overwrite the FDT, initrd or U-Boot in memory.

于 2014-01-21T05:52:55.273 に答える
0

カーネル/FDT/ブートローダー コマンド ラインの優先順位は、カーネル構成によって異なります。menuconfig を実行し、[ブート オプション] で確認してください。ATAGS を組み込みのコマンド ラインと組み合わせることができますが、FDT を組み合わせることはできません。結局のところ、FDTchosenノードはブートローダーによって生成されることになっています。 FDT コマンドラインが必要な場合は .dts。

カーネルは、ブートローダーが指定どおりに配置されていることを盲目的に信頼する必要があるため、メモリ マップを取得する前はかなり保守的です。一方、U-bootはそれ自体のビットをあちこちにコピーしており、確かにRAMのトップエンドの原因です- #define DEBUG(私が思うに)common/board_f.c再配置中にヒットしたもののダンプを取得します(含まれていませんExynos iRAM SPL/ブートコードのものですが、とにかくここでは違いはありません)。

于 2014-01-24T01:11:01.473 に答える