以下仅为基本思路,实现的时候有些许变动。
有任何疑问或者更好的实现方法,请联系我 🙂
SGOS2的进程创建过程
1. 创建者调用sys_process_create系统调用,要求创建一个进程,同时传入命令行参数cmdline和环境变量environment variables。
2. 内核创建一个内核态的进程结构体,并把命令行参数和环境变量保存在结构体里。
3. 内核为新进程创建一个内核线程,对新进程的运行环境进行初始化,例如分配用户态进程信息块,设置环境变量等。
4. 创建者从sys_process_create返回到用户态继续执行。
5. 新进程的内核线程对进程初始化完毕后,加载api.bxm模块,创建一个用户态线程,并执行api.bxm的__start_process。
6. 在__start_process里,会获取命令行参数和环境变量,然后调用loader_open加载可执行文件。线程会进入内核态,然后完成其它导入模块的加载和链接。
7. 加载完毕后,新进程的线程会获取模块的入口,然后跳转到入口执行。至此,进程创建工作大功告成。
SGOS2的线程创建过程
1、 创建者调用sys_thread_create系统调用,要求创建线程。
2、 内核创建线程结构体,设置线程状态为挂起,并初始化用户态信息块。
3、 创建者调用sys_thread_resume让新线程加入调度队列。
4、 新线程被调度时,在api.bxm的__start_thread处开始运行,从用户态线程信息块中获取创建信息,例如入口地址,传入参数,是否需要给寄存器装入预定的值等,并且初始化异常处理器,然后跳转到入口执行。执行完毕后,返回到__start_thread,调用sys_thread_exit退出线程。
SGOS2进程的结束过程
1. 检查当前状态是否为可以被结束。
2. 结束属于该进程的其它所有线程,同时释放线程资源。
3. 向一些系统服务发送进程销毁消息,以释放该进程的资源。
4. 释放进程加载的模块。
5. 释放进程用户态使用的物理页面。
6. 设置进程为死亡,等待回收。
7. 调用schedule切换到其它进程。
了解了。
呵呵,我的内核中的打算就简单多了,可见小虾哥功力之深沉。。。
我内核中把线程看作是共享资源的进程而已。呵呵。很简单吧。。。。