8

SDRAM の一部 (たとえば 4 バイト) を予約して、U-Boot と Linux カーネルの間でフラグを渡し、この予約済みメモリ ロケーションがリンカによって初期化されず、ウォーム ブート後に値が保持されるようにするにはどうすればよいですか? 組み込みアプリケーションで使用される NAND フラッシュの消耗を最小限に抑えるために、bootargs の使用を避けようとしています。私の質問は 、ARM プロセッサでコールド ブートとウォーム ブートを検出する方法を教えてください。

以下のリンカー スクリプトを使用して u-boot.lds をビルドし、-fno-zero-initialized-in-bss を使用してビルドしましたが、成功しませんでした。

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
 . = 0x00000000;
 . = ALIGN(4);
 .text :
 {
  cpu/arm926ejs/start.o (.text)
  *(.text)
 }
 . = ALIGN(4);
 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
 . = ALIGN(4);
 .data : { *(.data) }
 . = ALIGN(4);
 .got : { *(.got) }
 . = .;
 __u_boot_cmd_start = .;
 .u_boot_cmd : { *(.u_boot_cmd) }
 __u_boot_cmd_end = .;
 . = ALIGN(4);
 __bss_start = .;
 _U_BOOT_FLAG = .;  . = . + 4;
 .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
 _end = .;
}

何か案は?

4

2 に答える 2

3

U-BootとLinuxARMカーネルの間でデータを渡す方法はすでにあります。これはATAGメモリリストと呼ばれます。使用可能なメモリ領域やボード情報などの情報は、このデータリストを使用してU-BootからLinuxARMカーネルに渡されます。データのカスタムATAGを定義できます。U-Bootで、ARMタグを作成するためのルーチンを追加しますlib_arm/armlinux.c。次に、ATAGはで処理されarch/arm/kernel/setup.cます。

ドキュメントについては、このサイトまたはこの代替サイトのセクション8を参照してください。

補遺
参照されているATAGドキュメントへのリンクは希薄です(Googleにも悪いリンクがあります)。
ドキュメントの実際の名前を検索してみてください。これは、VincentSandersによる「BootingARMLinux」です。
現在、Googleのsimtecサイトのキャッシュにコピーがあり、より広範な検索で韓国語(?)の翻訳が見つかりました。

ARMの起動に関するRusselKingによる別のまたは以前のバージョン(?)(ただし更新されているようです)はここにあります。

于 2012-08-27T20:38:16.167 に答える
0

ARM プロセッサでコールド ブートとウォーム ブートを検出する方法のグローバル変数アプローチを使用する場合は? :

そのグローバル変数を特定の ELF セクション ( http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.htmlを参照) に配置し、リンカー スクリプトでそのセクションを特定のアドレス。

優れた ld スクリプト スキルがあれば、リンカにその 1 つを除くすべての bss セクションを初期化させることもできます :)

于 2012-04-29T12:47:56.707 に答える