内核线程
当bios把os的内核代码从磁盘上加载到内存, os完成内存初始化后,就可以开始执行各种函数进行工作了,单片机就是到这一步,后续执行自身的代码逻辑。而os是给通用计算用的,他需要加载用户程序,所以还不能这么简单的处理。单片机的模式是传感器->cpu/软件逻辑->执行机构,计算机的模式是输入->cpu/软件->人。计算机的输出,驱动的是人,而不是步进马达。
os在加载用户进程前,还要先创建一些必要的内核线程。这些线程也会和用户进程一起参与调度。为了能让多个线程,并发执行,os需要设计一套机制,能够让多个线程、进程共存和切换。这套机制中会有很多复杂的数据结构,会利用栈,会利用很多寄存器。
内核之所以能够切换这些线程或进程,是通过切换相关寄存器来实现的,比如切换eip,代码执行位置就变了,切换esp,ebp,进程的栈就变了。所以,切换前要保护现场,就是要找块内存记录下这些值。这些值是PCB进程控制块的一个成员叫context,context保存了8个寄存器。
内核把当前执行线,封装为主线程,叫idle_proc,实际上他只是做调度。
idle_proc创建了init_main这个内核线程,init_main创建了user_main,启动用户shell。然后init_main就进入wait状态,然后也是反复执行schedule()。
内核线程会通过调用schedule(),主动放弃cpu,换句话说,就是用户进程没法通过时钟中断抢到cpu。而用户进程时间片一到就会被os强制放弃cpu。
用户进程