1、0号进程
![](https://img.haomeiwen.com/i5346502/946b2a235a892e4a.png)
Ucore的初始进程:idleproc,PID=0,所有进程或内核线程都是idle的后代,是idle的clone,idle是静态创建启动的。
state状态始终为PROC_RUNNABLE运行态;系统堆栈为bootstack;need_resched始终为1(需要调度),一直循环检查是否有就绪的,随时准备将CPU让出;context和trapframe为空(做完1好进城,需要调度后,0号进程失去CPU,保存现场,使context有内容);idle不在proc_list和hash_list中。
![](https://img.haomeiwen.com/i5346502/4d4ac39f48e57155.png)
2、1号进程
initproc是一号进程,idle进程动态创建,是一个内核线程。
内核线程 --> kernel_thread 只能在内核中使用 ;用户进程 --> fork 常在用户空间使用。
均由do_fork实现,具体ucore过程见ppt。
![](https://img.haomeiwen.com/i5346502/05e75a70ba956aa3.png)
![](https://img.haomeiwen.com/i5346502/7a75c0d559dc3ff6.png)
3、用户进程
init创建的第一个用户进程。
![](https://img.haomeiwen.com/i5346502/632cd9954de7147d.png)
到用户堆栈后特权级变为3,内核态为0。
(详见ppt)
4、系统调用
![](https://img.haomeiwen.com/i5346502/08d3af39e8020abb.png)
(1)fork —— 用户进程使用的进程创建函数
![](https://img.haomeiwen.com/i5346502/d3d2c3c5843c7f77.png)
(2)exec —— 用户进程使用的加载函数
(3)yield —— 告诉内核可以让一下CPU
(4)exit —— 请求终止自己。
idle和init进程不能终止。
![](https://img.haomeiwen.com/i5346502/1b58dfe3a8ad9c15.png)
(5)wait —— 由父进程调用,回收已经终止的子进程
![](https://img.haomeiwen.com/i5346502/82dde13c27d38a0e.png)
![](https://img.haomeiwen.com/i5346502/d29c942833e660eb.png)
(6)kill —— 用于杀死指定进程
![](https://img.haomeiwen.com/i5346502/ccf7123cc24c0697.png)
网友评论