OK6410A 开发板 (八) 26 linux-5.11 OK6410A 进程角度 idle进程的建立过程

  • 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 重新执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值