- .section .boot, "ax", @progbits
- FUNC_BEGIN(resetEntry)
- FUNC_LABEL(_resetEntry)
- 此处省略很多指令
- .section .reset, "ax", @progbits
- FUNC_BEGIN(resetVector)
- b resetEntry
- FUNC_END(resetVector)
通过.section.reset在0xfffffffc处生成
b resetEntry
的指令,达到加载的目的。当然了,调用0xfffffffc就会导致系统复位了。下面是link中的代码。
- .reset BIND(wrs_kernel_text_start + wrs_kernel_rom_size - 4) :
- {
- *(.reset)
- }
号外的是,直接调用0xfffffffc会由于一些寄存器没有初始化好,cache与tlb还有些其它寄存器如MSR没有正确初始化,会导致CPU挂死,这时,可以依赖watchdog产生复位信号,从而成功初始化CPU。