1

我有一个使用 arm-compiler-6 (armclang) 为 cortex-A53 编译的非常简单的项目。该项目包含一个 main.c、一个分散文件和一个 startup.s。这是它的分散文件:

LOAD 0x00000000
{
  ROM +0x0
  {
     startup.o(BOOT, +FIRST)
     * (+RO)
  }
  TEST_DATA 0x40000 EMPTY 0x1000
  {
  }
  RAM +0x0
  {
    * (+RW, +ZI)
  }

  ARM_LIB_STACKHEAP +0x0 EMPTY 0x00010000
  {}
}

简而言之,这是 startup.s 中的初始化代码:

start64:  
  // Which core am I
  // ----------------
  MRS      x0, MPIDR_EL1
  AND      x0, x0, #0xFF                     // Mask off to leave Aff0
  CBZ      x0, boot                          // If core 0, run the primary init code
sleep:
  WFI
  B        sleep
boot:
  // Disable trapping of CPTR_EL3 accesses or use of Adv.SIMD/FPU
  // -------------------------------------------------------------
  MOV      x0, #0                           // Clear all trap bits
  MSR      CPTR_EL3, x0


  // Install a vector table
  // -----------------------------
  .global  vectors
  LDR      x0, =vectors
  MSR      VBAR_EL3, x0


  // Configure SCR_EL3
  // ------------------
  MOV      w1, #0              // Initial value of register is unknown
  ORR      w1, w1, #(1 << 11)  // Set ST bit (Secure EL1 can access CNTPS_TVAL_EL1, CNTPS_CTL_EL1 & CNTPS_CVAL_EL1)
  ORR      w1, w1, #(1 << 10)  // Set RW bit (EL1 is AArch64, as this is the Secure world)
  ORR      w1, w1, #(1 << 3)   // Set EA bit (SError routed to EL3)
  ORR      w1, w1, #(1 << 2)   // Set FIQ bit (FIQs routed to EL3)
  ORR      w1, w1, #(1 << 1)   // Set IRQ bit (IRQs routed to EL3)
  MSR      SCR_EL3, x1

  ISB

  // Initialize stack pointer
  // ------------------------
  .global Image$$ARM_LIB_STACKHEAP$$ZI$$Limit
  LDR      x0, =Image$$ARM_LIB_STACKHEAP$$ZI$$Limit
  MOV      sp, x0

  // Branch to scatter loading and C library init code
  .global  __main
  B        __main

不幸的是,当数据和 bss 放在 RAM 部分时,项目根本无法运行。当我将它们放在 ROM 部分时,项目可以正常运行,但当然,我只能读取全局变量而不能修改它们的值。一般来说,我可以在运行时从 RAM 读取和写入。我怀疑我的初始化代码中缺少某些阶段。据我了解,由 __main 调用的 __scatterload 负责将 ZI 初始化为零。谢谢您的帮助。

4

0 回答 0