使用Linux引导ARM Cortex-A辅助核心

时间:2015-06-24 16:11:57

标签: linux-kernel arm

我需要指出Linux如何实现在多核SOC中启动辅助CPU核心。 Trustzone实现是否必须启动辅助CPU核心?

1 个答案:

答案 0 :(得分:1)

Linux如何实现在多核SOC中启动辅助CPU核心?

多核启动的具体实现取决于平台。我们以ARM Versatile Express为例。 VE平台提供了一个特殊的启动寄存器,以帮助进行二级核心启动。所有内核都不会重置,并执行类似于

下面的伪代码的代码
if( get_cpu_id() == PRIMARY_CORE )    
{     
   //Primary core enters here    
   //proceed with booting OS (Linux)
}
else
{
  //Secondary core enters here
  while( *boot_reg == 0x0 )
  {
      WFI //Sleep here, wait for interrupts
  }

  (*boot_reg)(); //Jump to address pointer by boot_reg
}

在设置GIC等基本功能后,Primary核心会将一个辅助核心跳转地址写入boot_reg。然后,主内核将生成一个SGI(软件生成的中断),针对它想要带出复位的二级内核。因此,二级内核被唤醒并跳转到操作系统的代码中,用于辅助内核相关的初始化,如页表基址设置,MMU启用等。

启动辅助CPU核心是否必须实施Trustzone?

如果您的ARM内核支持Trustzone(安全扩展),则所有内核在重置后都将处于安全管理员模式。理想情况下,您需要在启动之前切换到非安全管理程序模式。此模式更改必须由所有核心执行。如果您的ARM内核不支持Trustzone,则在重置后它将处于NonSecure Supervisor模式,因此不需要特殊处理。虚拟化扩展也是如此。如果您的ARM内核支持虚拟化,并且您希望支持虚拟机管理程序(这是可选的),则在模式切换到非安全管理程序模式之前,您必须进行模式切换到管理程序模式(针对hyp init)。