我正在运行 minix 3.1.2a,我的目标是启动 BSP 以外的 AP 处理器,我遵循通用启动算法:
- BSP 向 AP 发送一个 INIT IPI
- BSP 延迟(10 毫秒)
- BSP 向 AP 发送 STARTUP IPI
- BSP 延迟 (200μSEC)
- BSP 向 AP 发送 STARTUP IPI
- BSP 延迟 (200μSEC)
这是读取 ACPI 表后执行 INIT IPI 和 STARTUP 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");
}
}
}
我想指出,我在具有 Windows 7 64 位的核心 i7 主机上运行,并且我有 3 个不同的虚拟 M/C:
- VMWARE工作站
- VBOX
- QEMU 管理器
1-on VMWARE:
主要是我在 VMWARE 上运行我的 guest minix,当我运行前面提到的代码时:
- 当我选择处理器数量,即 4 和核心数量 1,并运行该代码时,系统将继续重新启动。
- 当我选择处理器数量(即 1 和核心数量 4)并运行该代码时,系统将挂起。
2-on VBOX:
- 当我选择处理器数量 4 并运行该代码时,系统将挂起。
3-on QEMU:首先acpi校验和不正确,所以我手动输入CPUAPIC ID只是为了测试即APIC ID = 1 - 当我选择cpus 4的数量时,运行该代码系统将挂起。
实际上我在这个问题上停留了 10 多天,我拔掉了我所有的头发,我无法理解为什么没有开始,所以如果有人能帮助我,我将不胜感激