Can';t在MINIX中启动SMP AP处理器:启动\u IPI重新启动并挂起

Can';t在MINIX中启动SMP AP处理器:启动\u IPI重新启动并挂起,c,intel,minix,smp,C,Intel,Minix,Smp,我正在运行minix 3.1.2a,我的目标是启动除BSP以外的APs处理器,我遵循通用启动算法: BSP向AP发送初始IPI BSP延迟(10毫秒) BSP向AP发送启动IPI BSP延迟(200微秒) BSP向AP发送启动IPI BSP延迟(200微秒) 以下是读取ACPI表后执行初始化IPI和启动IPI的函数: void START_APs2() { u32_t trampoline_addr; int UseCPU = 1; u32_t reg; /* Try to

我正在运行minix 3.1.2a,我的目标是启动除BSP以外的APs处理器,我遵循通用启动算法:

  • BSP向AP发送初始IPI
  • BSP延迟(10毫秒)
  • BSP向AP发送启动IPI
  • BSP延迟(200微秒)
  • BSP向AP发送启动IPI
  • BSP延迟(200微秒)
以下是读取ACPI表后执行初始化IPI和启动IPI的函数:

void START_APs2()
    {

 u32_t trampoline_addr;
 int UseCPU = 1;
 u32_t reg;
 /* Try to allocate the trampoline for APs to start */
                if ((trampoline_addr=find_trampoline())) 
                 {



 reg = LOCAL_APIC_READ(LOCAL_APIC_SPIV);
   reg |= 0x1FF;    /* Disable apic */
   LOCAL_APIC_WRITE(LOCAL_APIC_SPIV, reg);


                        /*======================== INIT IPI==============================*/



                     CLI();

                        /*LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH, (unsigned long)cpus[UseCPU].ApicID << 24);*/
                       LOCAL_APIC_WRITE(LOCAL_APIC_ICR_LOW,  (unsigned long)  (0x4500) | (trampoline_addr>>12)|(DEST_OTHERS << DEST_SHORT_SHIFT));
                        /*wait_for_ipi_completion();*/
                       VerifyLoop();

                       /*Some delay ...*/
                      milli_delay(100);

                       /*=============================STARTUP IPI==============================*/


                      /* LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH, (unsigned long)cpus[UseCPU].ApicID <<24);*/
                       LOCAL_APIC_WRITE(LOCAL_APIC_ICR_LOW,  (unsigned long)  (0x5600) | (trampoline_addr>>12)|(DEST_OTHERS << DEST_SHORT_SHIFT));
                       VerifyLoop();

                          /*Some delay ...*/
                      milli_delay(200);

                       /* send the IPI */

                       /*LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH, (unsigned long)cpus[UseCPU].ApicID <<24);*/
                       LOCAL_APIC_WRITE(LOCAL_APIC_ICR_LOW,  (unsigned long)  (0x5600) | (trampoline_addr>>12)|(DEST_OTHERS << DEST_SHORT_SHIFT));
                       VerifyLoop();

                          /*Some delay ...*/
                      milli_delay(200);

                      STI();
                     /* enable_cpu(this_cpu, WITHOUT_ECHO);*/
                       if (! AP_running()) 
                          {
                              Aprintf(("\n\n*** WARNING! AP# %d  is not running ***\n\n",(unsigned long)cpus[UseCPU].ApicID));

                          }
                          else
                          {
                               Aprintf("\n\n***AP RUNNING SUCCESSFULLY");

                          }

                 }
}
void START_APs2()
{
u32蹦床地址;
int-UseCPU=1;
u32_t reg;
/*尝试分配蹦床供AP开始*/
如果((蹦床添加=查找蹦床())
{
reg=本地APIC读取(本地APIC SPIV);
reg |=0x1FF;/*禁用apic*/
本地APIC写入(本地APIC SPIV,reg);
/*========================================初始IPI==============================*/
CLI();

/*LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH,(unsigned long)cpu[UseCPU].ApicID>12)|(DEST_其他人是否已启用IA32_APIC_BASE MSR中的LAPIC?发送IPI时,向量字段必须为0,断言位应为0,目标模式位应为1(似乎您在使用速记)。发送SIPI时,目标模式位也应为1,并且您不应设置传递状态位。最后请记住,向量场只有8位长,因此您的蹦床长度不得超过0ff000h。非常感谢它现在可以工作。更通用的方法是: