我需要指出Linux如何实现在多核SOC中启动辅助CPU核心。 Trustzone实现是否必须启动辅助CPU核心?
答案 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)。