你能告诉我如何在 ARM 架构 v7 中替换辅助 cpu 的重置向量吗?

Could you tell me how to replace reset vector for secodary cpus in ARM architecture v7?

我知道手臂复位向量可以是低位 (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 核心上——据我所知是所有这些——"low vectors" 地址(当 SCTLR.V == 0 时)是 不是 硬编码为 0,而是使用 VBAR 系统寄存器设置。 VBAR 在安全和非安全状态之间存储,因此它们的向量表可以分别放置在任何 32 字节对齐的虚拟地址而不会相互干扰,即使在两种状态下 MMU 都关闭。

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