SGOS2进程与线程的创建过程

以下仅为基本思路,实现的时候有些许变动。

有任何疑问或者更好的实现方法,请联系我 🙂



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切换到其它进程。

SGOS2进程与线程的创建过程》有2个想法

  1. malpower

    呵呵,我的内核中的打算就简单多了,可见小虾哥功力之深沉。。。
    我内核中把线程看作是共享资源的进程而已。呵呵。很简单吧。。。。

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据