我知道手臂复位向量可以是低(0x00000000)或高(0xffff0000)。
但是Linux内核中的某些SoC代码表示可以更改复位向量。
例如,在mach-imx中
static int __cpuinit imx_boot_secondary(unsigned int cpu, struct task_struct *idle)
{
imx_set_cpu_jump(cpu, v7_secondary_startup);
imx_enable_cpu(cpu, true);
return 0;
}
void imx_set_cpu_jump(int cpu, void *jump_addr)
{
cpu = cpu_logical_map(cpu);
writel_relaxed(virt_to_phys(jump_addr),
src_base + SRC_GPR1 + cpu * 8);
}
他们说,辅助CPU可以通过jump_addr跳到所需的位置。
你能告诉我它是如何工作的吗?
最佳答案
在实现TrustZone的安全扩展的ARMv7内核上(据我所知全部都是),“低向量”地址(当SCTLR.V == 0时)未硬编码为0,而是设置为VBAR系统寄存器。 VBAR存储在安全状态和非安全状态之间,因此,即使MMU在这两种状态下都处于关闭状态,它们的向量表也都可以放置在任何32字节对齐的虚拟地址上,而不会互相干扰。
请注意,尽管这是您提出的问题,但此处的代码实际上根本不是那样。这只是将入口点地址存储在复位控制器的非易失性寄存器中(常见的替代方法是在某些共享存储器中使用变量,引导加载程序将其自身加载到该共享存储器中);辅助CPU仍将退出复位并进入默认ROM向量,并执行一堆自初始化代码-如果CPU打算切换到非安全状态,则该代码将涉及设置非安全VBAR。 。该启动代码最终将以从任何存放地开始读取该入口点地址而结束,然后简单地跳转到该入口点地址。