0

内部 ROM から SRAM への u-boot の再配置を理解しようとしています。以下のコードは、u-boot が ROM から SRAM にコピーされ、pc が _start_armboot にジャンプされることを示しています。ただし、メモリの再マップ操作がコードのどこで行われているのかわかりません。

u-boot-2010.09\arch\arm\cpu\arm920t\start.S からの抜粋

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:               /* relocate U-Boot to RAM       */
    adr r0, _start      /* r0 <- current position of code   */
    ldr r1, _TEXT_BASE      /* test if we run from flash or RAM */
    cmp r0, r1          /* don't reloc during debug         */
    beq stack_setup

    ldr r2, _armboot_start
    ldr r3, _bss_start
    sub r2, r3, r2      /* r2 <- size of armboot            */
    add r2, r0, r2      /* r2 <- source end address         */

copy_loop:
    ldmia   r0!, {r3-r10}       /* copy from source address [r0]    */
    stmia   r1!, {r3-r10}       /* copy to   target address [r1]    */
    cmp r0, r2          /* until source end addreee [r2]    */
    ble copy_loop
#endif  /* CONFIG_SKIP_RELOCATE_UBOOT */

    /* Set up the stack                         */
stack_setup:
    ldr r0, _TEXT_BASE      /* upper 128 KiB: relocated uboot   */
    sub r0, r0, #CONFIG_SYS_MALLOC_LEN  /* malloc area              */
    sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo                 */
#ifdef CONFIG_USE_IRQ
    sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
    sub sp, r0, #12     /* leave 3 words for abort-stack    */
    bic sp, sp, #7      /* 8-byte alignment for ABI compliance */

clear_bss:
    ldr r0, _bss_start      /* find start of bss segment        */
    ldr r1, _bss_end        /* stop here                        */
    mov r2, #0x00000000     /* clear                            */

clbss_l:str r2, [r0]        /* clear loop...                    */
    add r0, r0, #4
    cmp r0, r1
    ble clbss_l

    ldr pc, _start_armboot

AT91RM9200 のデータシートには、内部 ROM はリセット後にアドレス 0x0000_0000 でアクセスでき、SRAM はアドレス 0x0020_0000 でのみアクセスできると記載されています。リマップ後、SRAM はアドレス 0x0000_0000 でも利用でき、内部 ROM はアドレス 0x0010_0000 でアクセスできます。

u-boot でのリマップ操作を理解し、これに対応するコードを教えてください。

ありがとう

4

2 に答える 2

2

内部 ROM から SRAM への u-boot の再配置を理解しようとしています。

あなたの質問は、2 つの誤解に基づいています。

誤った前提 #1 : U-Boot が内部 ROM に格納されている

U-Boot は AT91RM9200 の内部 ROM には保存されません。
内部 ROM には、公開されていない独自の Atmel コードが含まれています。AT91RM9200 のデータシートには、この内部 ROM コードの機能が「ブート プログラム」および「ブート アップローダー」として記述されています。

AT91 SoC の次のバージョンである AT91SAM926x 製品では、内部 ROM のファームウェアは明示的にROM ブートプログラム (別名RomBOOT (sic)) およびSAM-BA モニター プログラムと呼ばれます。

誤った前提 #2 : U-Boot が SRAM にロードされている

U-Boot は (通常) AT91RM9200 の組み込み SRAM にロードされません。
AT91RM9200 の内部 SRAM は小さすぎて (スタックと変数の 16KiB から 3KiB を差し引いたもの)、U-Boot の (典型的な) コピーを格納できません。

U-Boot は通常、第 2 レベルのブートローダー (SRAM 内) (後続の AT91SAM 製品では AT91Bootstrapとして知られています) によって外部 SDRAM にロードされます。
AT91M9200 (およびその他の AT91SAM 製品) では、U-Boot は通常、第 3 レベルのブートローダーとして使用されます。

AT91M9200 を使用する場合、内部 ROM から U-Boot を再配置する必要はありません。


AT91RM9200 のブート シーケンスは、後続の AT91SAM SoC 用に形式化されており、次のLinux4SAM図に示されています。左側にはコード モジュールとブート シーケンスが記述され、右側にはプログラムがインストールまたはロードされた (矢印で示されている) 物理メモリが記述されています。ここに画像の説明を入力


補遺

AT91RM9200 ブートローダー (u-boot で起動するため) に関するこのスレッドも参照してください。
顕著なテキストは「... u-boot (ROM ブートローダーが処理するには大きすぎます)」です。どうやら AT91RM9200 ブートストラップに関する"atmel appnote"
についての言及もありますが、Atmel サイトで見つけることができません。AT91RM9200DK U-Boot Flash Programming Solutionsというアプリケーションノートがアーカイブされていますが、そのボードは通常、外部 NOR フラッシュ (つまり、内部 ROM を無効にする BMS=1) から起動します。

補遺#2

U-Boot 開発者 (Wolfgang Denk) と Atmel エンジニア (Ulf Samuelsson) からの決定的な (そして確認する) 回答については、このスレッドを参照してください。
顕著なテキストは、「Atmel からの指示から収集したものについては、U-Boot の前に常にブートローダーがあり、データフラッシュ、シリアル ポート、または [NAND] フラッシュからロードしています ...」 (外部 NOR から起動している場合を除く)フラッシュおよび BMS=1、つまり内部 ROM を無効にします)。

補遺#3

CONFIG_SKIP_RELOCATE_UBOOT に関する明確化:
U-Boot は、メイン メモリにロードされた後、使用可能なメモリを最大化するために上位メモリに再配置される場合があります。
たとえば、64MB があると仮定して、0x03F30000 で開始するようにリンクされた U-Boot イメージをロードしました。ただし、ボードには実際には 128MB の RAM が搭載されていました。0x07F70000 で U-Boot の重複イメージを見つけました。
テストを実行しmtest 0x00000000 0x07F00000、最大メガバイトの RAM を除くすべてを上書きし、0x03F30000 にロードされた U-Boot が実行されていないことを証明しました。メモリの上半分をテストするために を実行するmtest 0x04000000 0x08000000と、誤動作/失敗し、U-Boot が元のロードされた場所ではなく、上位メモリから実行されていることが示されました。

于 2014-12-29T00:40:39.080 に答える