- 论坛徽章:
- 0
|
关于Linux的多核启动问题,看到过这样的代码:
start_eip = setup_trampoline(); // 得到trampoline.S代码的入口地址
*((volatile unsigned short *) phys_to_virt(0x469)) = start_eip >> 4;
*((volatile unsigned short *) phys_to_virt(0x467)) = start_eip & 0xf;
// 将trampoline.S的入口地址写入热启动的中断向量(warm reset vector)40:67
apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid));// 确定发送对象
apic_write_around(APIC_ICR, APIC_INT_LEVELTRIG | APIC_DM_INIT); // 发送INIT IPI
apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid)); //确定发送对象
apic_write_around(APIC_ICR, APIC_DM_STARTUP | (start_eip >> 12)); //发送STARTUP IPI
想问的是,将trampoline.S的入口地址写入0x467之后,AP是怎么跳到0x467去执行代码的?
我目前知道的是,通过IPI机制,那么在发送STARTUP IPI时,ICR寄存器的vertor阈为什么要设置成(start_eip >> 12)?这个不是应该是中断号吗?
(start_eip >> 12)是工作的?怎么能够跳到0x467呢?
请教,在线等啊~~~
|
|