多核网络处理器启动流程
以下主要针对RMI的多核处理器,例如XLR732,其由八个核心,每个核心由4个硬线程组成。上电之后,第一个核心的第一个线程启动(Core0/Thread0),从复位向量地址开始执行。假设使用的bootloader是Uboot,此线程负责初始化当前核心的cache缓存,内存初始化等。之后负责启动其它核心的首线程,即Core1/Thread0一直到Core7/Thread0。这些线程启动之后,进行本核心的cache缓存初始化工作,之后再环形核心上的其它线程,例如Core1/Thread0将唤醒Core1/Thread1到Core1/Thread3等三个线程,最终Core1到Core7的所有线程进入等待状态,对于XLR732处理器而言,等待FMN消息环上的特定消息。
核心线程Core0/Thread0随后唤醒其核心上的Thread1到Thread3等线程,这三个线程与以上的其它线程一样进入等待FMN消息状态。Uboot在加载启动Linux内核之后,启动完成。流程如下所示:
内核启动之后,仅有Core0/Thread0在运行。在内核函数start_kernel中,其发送特定的消息到FMN环上,唤醒等待的其它核心线程。由于多核处理器的软件架构,并不需要所有的核心运行Linux操作系统,需要留出其它核心运行数据平面处理程序。对于RMI的处理器数据包程序可运行RMIOS,对于CAVIUM的NP可运行SE。最后,调用smp_init初始化内核SMP功能。
完。