0

我知道手臂复位向量可以是低(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跳转到你想要的地方。

你能告诉我它是如何工作的吗?

4

1 回答 1

0

在实现 TrustZone 安全扩展的 ARMv7 内核上——据我所知,它们都是——“低向量”地址(当 SCTLR.V == 0 时)没有硬编码为 0,而是设置为VBAR 系统寄存器。VBAR 在安全和非安全状态之间存储,因此它们的向量表可以分别放置在任何 32 字节对齐的虚拟地址上,而不会相互干扰,即使 MMU 在两种状态下都关闭。

请注意,虽然这是您提出的问题,但此处的代码实际上并非如此。这只是将入口点地址存储在复位控制器的非易失性寄存器中(一种常见的替代方法是在引导加载程序将自身加载到的某些共享内存中使用变量);辅助 CPU 仍会从复位状态恢复到默认 ROM 向量并执行一大堆自初始化代码 - 巧合的是,如果 CPU 要切换到非安全状态,这些代码将涉及设置非安全 VBAR . 该启动代码最终将以从它被隐藏的任何地方读取这个入口点地址并简单地跳转到它而结束。

于 2015-10-23T08:28:15.737 回答