【问题标题】:Could you tell me how to replace reset vector for secodary cpus in ARM architecture v7?您能告诉我如何在 ARM 架构 v7 中替换辅助 CPU 的重置向量吗?
【发布时间】:2015-10-23 01:28:50
【问题描述】:

我知道手臂复位向量可以是低(0x00000000)或高(0xffff0000)。 但是一些 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);
}

他们说辅助 cpu 可以通过 jump_addr 跳转到您想要的位置。

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

【问题讨论】:

    标签: c linux-kernel arm smp soc


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 2021-02-24
      • 2013-10-27
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多