最近的几个项目都不止一次的碰到了MP 初始化的问题,每次都花了不少的时间,于是打算总结一下多处理器初始化的流程,以备将来再次碰到的问题时方便查找。 MP初始化指的是在一个有至少2个或者多个处理器的系统里,怎么去初始化所有的处理器,让系统工作起来。IA-32 ARCH 定义了MP 初始化的协议,该协议使得IA-32,X64的MP系统都可以boot,并且并不需要多余的特定的信号,或者指定特定的BSP.
1.BSP AP处理器:
MP的系统里定义了2种类型的处理器: BSP 和 AP。BSP是boot strap processor, AP是指application processor。其实BSP和AP并没有本质的区别而且也不是固定的,BSP是由硬件动态选择的。其中一种算法是,上电以后每个处理器执行BIST(built in self test),通过自检以后,大家都去monitor BNR(Bus Not Ready)的信号。如果BNR#一直在翻转,说明还没有ready。一旦BNR#停止翻转,每个处理器都尝试发一个NOP special cycle,第一个成功发出的就是BSP。BSP选出来以后,它会把IA32_APIC_BASE MSR里面的BSP flag设置起来。然后就会开始从reset vector开始执行。其它的AP就会进入”wait-for-SIPI state”。