Проблема с загрузкой bss и данных в память

У меня есть очень простой проект, скомпилированный для cortex-A53 с помощью arm-compiler-6 (armclang). Этот проект содержит main.c, scatter-файл и startup.s. Это его scatter-файл:

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, проект запускается правильно, но, конечно, я могу только читать глобальные переменные, но не изменять их значения. В общем, я могу читать и писать из ОЗУ во время выполнения. Я подозреваю, что в моем коде инициализации отсутствует какой-то этап. Насколько я понимаю, __scatterload, который вызывается __main, отвечает за инициализацию ZI в ноль. Спасибо за помощь.

0 ответов

Другие вопросы по тегам