я запускаю 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 дней, и я выдергиваю все свои волосы, я не могу понять, почему не запускается, поэтому, если кто-нибудь может помочь, я буду признателен