Проблема с загрузкой 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 в ноль. Спасибо за помощь.