操作系统——进程(一):简单的进程
实验目的:
进程的实现机理与进程管理
实验内容:
1.掌握进程相关数据结构的定义方法:
–进程控制块(进程表)、进程结构体、进程相关的GDT/LDT、进程相关的TSS,以及数据结构的关系
2.掌握构造进程的关键技术:
–初始化进程控制块的过程、初始化GDT和TSS、实现进程的启动
3.进程的现场保护与切换,弄清楚需要哪些关键数据结构与步骤
–时钟中断与进程调度关系,现场保护与恢复机理,从ring0–>ring1的上下文切换方法,中断重入机理
实验步骤
1.掌握进程相关数据结构的定义方法:
–进程控制块(进程表)、进程结构体、进程相关的GDT/LDT、进程相关的TSS,以及数据结构的关系
先看看进程切换的过程,可以发现至少需要保存进程状态,于是我们需要一个数据结构——进程表。
进程相关的GDT/LDT:
进程相关的TSS:
2.掌握构造进程的关键技术:
–初始化进程控制块的过程、初始化GDT和TSS、实现进程的启动
但是初始化了之后,我们需要反过来看看restart函数的含义:
P_proc_ready是指向进程表结构的指针,在初始化进程控制块、初始化GDT、TSS之后,使用iretd进行跳转,实现进程的启动。
3.进程的现场保护与切换,弄清楚需要哪些关键数据结构与步骤
–时钟中断与进程调度关系,现场保护与恢复机理,从ring0–>ring1的上下文切换方法,中断重入机理
时钟中断是一个重要的中断,它不像键盘中断那样需要交互,所以它可以作为进程切换的一个典型方式。在进程的运行时间到了后,就应该通过中断进行进程调度。在进程切换时需要保持当前状态,并读出内存中存取的另一进程状态,并交付控制权。从ring0到ring1的上下文切换是将特定的权限寄存器的值复原并且使用iretd来实现。中断重入是使用锁的机制保证同一时间只能有一个中断处理程序进行操作。
实验需要回答的问题:
1.描述进程数据结构的定义与含义:
–进程控制块(进程表)、进程结构体、进程相关的GDT/LDT、进程相关的TSS,画出数据结构的关系图
2.画出以下关键技术的流程图:
–初始化进程控制块的过程、初始化GDT和TSS、实现进程的启动
3.怎么实现进程的现场保护与恢复?
现场的保护就是讲进程信息压栈,将寄存器的值进行压栈。
然后要将esp设置为TSS中预设的值,之后中断会发生要将esp指向内核栈。
恢复的过程就是将push的过程替换为pop,并将esp的值重新设置。
4.为什么需要从ring0–>ring1,怎么实现?
因为时钟中断处理程序是在ring0进行的,但是进程是在ring1运行,所以需要从ring0到ring1的过程。从ring0到ring1只需要iretd。
5.进程为什么要中断重入,具体怎么实现,画出流程图?
进程遇到中断的时候,可能前一个中断还没有处理完,这时候如果继续处理中断可能会发生栈溢出的情况,因此需要使用锁来保证在同一时间只能由一个中断被处理。中断重入的功能就是这样。
6.动手做:修改例子程序的进程运行于ring3,并增加一个自定义的中断向量,使得进程因为这个中断而被暂停运行5s,并因为这个中断的再次触发而继续运行。
将例子程序的进程运行于ring3,即更改RPL与DPL的值即可。我们找到初始化其RPL与DPL的位置进行更改:
更改之后我们选择键盘中断作为自定义中断,来进行进程的操作。也就是说,按一下键盘时,进程应该立刻停止5秒,再之后应该恢复,继续打印。结果如下:
Here is keyboard_int 就是键盘中断处理程序的标志。原理和时钟中断类似,也使用了中断重入。
代码如上。