使用 Linux 启动 ARM Cortex-A 二级内核
Booting ARM Cortex-A secondary cores with Linux
我需要有关 Linux 如何在多核 SOC 中实现引导辅助 CPU 内核的指示。
启动辅助 CPU 内核必须实施 trustzone 吗?
如何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
}
Primary core在设置好GIC等基本功能后,会写一个secondary core的跳转地址到boot_reg。然后主内核将生成一个 SGI(软件生成的中断),目标是它想要使它脱离复位状态的辅助内核。因此次级核心被唤醒并跳转到 OS 的代码进行次级核心相关的初始化,如页面 table 基地址设置,MMU 启用等
启动辅助 CPU 内核必须实施信任区吗?
如果您的 ARM 内核支持 Trustzone(安全扩展),则所有内核在重置后都将处于安全监管模式。理想情况下,您希望在启动之前切换到非安全管理员模式。此模式更改必须由所有内核执行。如果您的 ARM 内核不支持 Trustzone,它将在复位后处于 NonSecure Supervisor 模式,因此不需要特殊处理。虚拟化扩展也是如此。如果您的 ARM 内核支持虚拟化并且您想要支持虚拟机监控程序(这是可选的),您必须先将模式切换到虚拟机监控程序模式(用于 hyp init),然后再切换到非安全监控模式。
我需要有关 Linux 如何在多核 SOC 中实现引导辅助 CPU 内核的指示。 启动辅助 CPU 内核必须实施 trustzone 吗?
如何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
}
Primary core在设置好GIC等基本功能后,会写一个secondary core的跳转地址到boot_reg。然后主内核将生成一个 SGI(软件生成的中断),目标是它想要使它脱离复位状态的辅助内核。因此次级核心被唤醒并跳转到 OS 的代码进行次级核心相关的初始化,如页面 table 基地址设置,MMU 启用等
启动辅助 CPU 内核必须实施信任区吗?
如果您的 ARM 内核支持 Trustzone(安全扩展),则所有内核在重置后都将处于安全监管模式。理想情况下,您希望在启动之前切换到非安全管理员模式。此模式更改必须由所有内核执行。如果您的 ARM 内核不支持 Trustzone,它将在复位后处于 NonSecure Supervisor 模式,因此不需要特殊处理。虚拟化扩展也是如此。如果您的 ARM 内核支持虚拟化并且您想要支持虚拟机监控程序(这是可选的),您必须先将模式切换到虚拟机监控程序模式(用于 hyp init),然后再切换到非安全监控模式。