动手写操作系统 -- 任务切换(共享栈)
04 Sep 2014
定时器中断弄好了,下面就可以调度切换任务了,先用2个任务试试
还是先上图,下面是两个任务,左边是任务1,依次输出’a’,’b’,右边任务2,依次输出’1’,’2’,。。。:
代码下载:funnyos_task_sharestack.7z
看下代码,分析如下:
基础知识:
在CPU触发中断前后,寄存器哪些值变了?
看下面图,这时手动执行int 08h,即软件触发定时器中断,左边是中断前的CPU值,右边是中断后的CPU值。
对比发现,中断时,CPU会自动将当前的EFLAG,下条指令对应的CS:IP压入栈中。
若中断后继续执行该任务,需将栈中的这3个寄存器保存下来。
若在某时刻切换到之前的任务,依次将上面的3个寄存器再放置栈中,执行iret指令(中断放回指令),即可继续执行任务。
注意:
上面只保存了EFLAGS,CS,IP,这样很片面,最好将CPU所有寄存器都保存下来。
而且在任务中全都用的是static变量,变量都保存在堆中,即任务没有用到自己独立的栈,共享的是系统栈。
若将任务代码中的static去掉,任务就不能正常运行了,因为栈被弄乱了。所以还需要为每个任务设置独立的栈。