我知道手臂复位矢量可以是低的(0x00000000)或高的(0xff0000)。但是一些SoC在linux内核中的代码说重置向量可以改变。
例如,在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);
}
他们说,通过jump_addr,辅助cpu可以跳到您想要的地方。
你能告诉我它是怎么工作的吗?
发布于 2015-10-23 08:28:15
在ARMv7核心上,实现TrustZone的安全扩展--据我所知,所有这些扩展--“低向量”地址(当SCTLR.V == 0时)不是硬编码为0,而是用VBAR系统寄存器设置的。VBAR存储在安全状态和非安全状态之间,因此它们的向量表都可以放置在任意32字节对齐的虚拟地址上,而不会相互干扰,即使在这两种状态下都不存在MMU。
请注意,虽然这是您提出的问题,但这里的代码实际上并不是这样。这只是将一个入口点地址存储在复位控制器中的一个非易失性寄存器中(一个常见的替代方法是在某个共享内存中使用一个变量,引导加载器将自己加载到其中);辅助CPU仍然会从重置到默认ROM向量中出来,并执行一整串自初始化代码--巧合的是,如果CPU要切换到非安全状态,该代码将涉及设置非安全VBAR。该启动代码最终将以读取这个入口地址而结束,不管它藏在哪里,然后简单地跳到它。
https://stackoverflow.com/questions/33293454
复制相似问题