我有一个使用 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 初始化为零。谢谢您的帮助。