/* 节选自[arch/i386/kernel/smpboot.c] do_boot_cpu() */
if (fork_by_hand() < 0) /* do_fork(CLONE_VM|CLONE_PID)创建一个新进程,与init_task一样具有0号pid */
panic("failed fork for CPU %d", cpu);
idle = init_task.prev_task; /*在进程列表中,新进程总是位于init_task的左链prev上 */
if (!idle)
panic("No idle process for CPU %d", cpu);
idle->processor = cpu;
idle->cpus_runnable = 1 << cpu; /* 在指定CPU上运行 */
map_cpu_to_boot_apicid(cpu, apicid);
idle->thread.eip = (unsigned long) start_secondary; /* 被调度到后的启动地址 */
del_from_runqueue(idle); /* idle进程不通过就绪队列调度 */
unhash_process(idle);
init_tasks[cpu] = idle; /* 所有idle进程都可通过init_tasks[]数组访问 */ |