- idle 进程的建立的 过程
idle 进程的建立的 过程 // 其实就是 init_task 结构体初始化的过程
1.sp 的初始化
// __mmap_switched -> ARM( ldmia r4!, {r0, r1, sp} )
// __mmap_switched_data:
// .long init_thread_union + THREAD_START_SP @ sp
// 在链接过程中确定了 一个值 (该值与 init_thread_union 相关)
// 将该值 写入 sp 中
// start_kernel 在 sp 对应的栈 中运行
2.TCB(init_task&init_thread_info)结构体的建立
// 静态创建的,不需要创建
// init_task&init_thread_info 是给 idle(一开始的裸机) 准备的 TCB
3.TCB(init_task&init_thread_info)结构体的定位
// idle 找到 为 它 准备的 TCB
// 根据current 找到该 裸机(后来的idle) 对应的结构体(init_task&init_thread_info)
// 其实不需要根据 current 找,直接 引用 init_task和init_thread_info 就可以了
// init_task 是 idle 进程的 信息1,供调度器(schedule)选择下一个进程用
// init_thread_info.cpu_context 是 idle进程的信息2,存储寄存器信息
4. init_idle:idle 进程的 信息1(init_task) 的初始化
//供 调度算法 选择 哪个进程 为 下一个进程
//5. kernel_thread/fork 的时候 建立了 其他(kenel_init) 进程
6. schedule:idle 进程的 信息2(init_thread_info.cpu_context) 的初始化
// 当前寄存器信息的保存
// idle调出 start_kernel->rest_init->schedule_preempt_disabled -> schedule -> __schedule -> context_switch
// 的时候 , 保存了 idle 的 各个寄存器 到 idle进程的信息2(init_thread_info.cpu_context)
// 这个过程是调度器的一部分,但是同时也是idle TCB 结构体初始化过程的一部分
7. 其他进程调用 schedule , 选中 init_task 为 下一个 进程
// schedule -> __schedule -> pick_next_task
8. 将 init_task 对应的 init_thread_info.cpu_context 恢复到寄存器中
// idle调入 schedule -> __schedule -> context_switch
// 的时候 , 恢复了 idle进程的信息2(init_thread_info.cpu_context) 到 寄存器
// 此时,idle 重新执行