Не удается запустить процессоры SMP AP в MINIX: startup_IPI перезагружается и зависает

я запускаю minix 3.1.2a, моя цель - запустить процессоры точек доступа, отличные от BSP, я следовал универсальному алгоритму запуска:

  • BSP отправляет AP INIT IPI
  • ЗАДЕРЖКИ BSP (10 мс)
  • BSP отправляет AP STARTUP IPI
  • Задержки BSP (200 мкс)
  • BSP отправляет AP STARTUP IPI
  • Задержки BSP (200 мкс)

вот функция для выполнения INIT IPI и STARTUP IPI после прочтения таблицы ACPI:

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");

                          }

                 }
}

я хотел бы отметить, что я работаю на хост-машине с ядром i7 с Windows 7, 64-бит, и у меня есть 3 разных виртуальных M/C:

  • РАБОЧАЯ СТАНЦИЯ VMWARE
  • VBOX
  • МЕНЕДЖЕР КЭМУ

1-на VMWARE:

в основном я запускаю свой гостевой миникс на VMWARE, когда я запускаю ранее упомянутый код:

  • когда я выбираю количество процессоров, то есть 4, и количество ядер 1, и запускаю этот код, система будет перезапускаться.
  • когда я выбираю количество процессоров, то есть 1, и количество ядер 4, и запускаю этот код, система зависает.

2-на VBOX:

  • когда я выбираю количество процессоров 4 и запускаю этот код, система зависает.

3-в QEMU: во-первых, контрольная сумма acpi неверна, поэтому я ввожу идентификатор CPUAPIC вручную только для проверки, т.е. идентификатор APIC = 1 - когда я выбираю число процессоров 4 и запускаю этот код, система зависает.

на самом деле я застрял в этой проблеме более 10 дней, и я выдергиваю все свои волосы, я не могу понять, почему не запускается, поэтому, если кто-нибудь может помочь, я буду признателен


person user2963216    schedule 03.06.2015    source источник
comment
Вы включили LAPIC в IA32_APIC_BASE MSR? При отправке IPI поле вектора должно быть равно 0, бит подтверждения должен быть равен 0, а бит режима назначения должен быть равен 1 (похоже, вы используете сокращение). При отправке SIPI бит режима назначения также должен быть равен 1, и вы не должны устанавливать бит состояния доставки. Наконец, помните, что векторное поле имеет длину всего 8 бит, поэтому размер вашего батута не должен превышать 0ff000h.   -  person    schedule 11.06.2015
comment
спасибо большое теперь работает   -  person user2963216    schedule 12.06.2015
comment
Более общее руководство: stackoverflow.com/questions/16364817/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 07.11.2015