本文共 1422 字,大约阅读时间需要 4 分钟。
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 重新执行
转载地址:http://tcigi.baihongyu.com/