编写实模式多任务操作系统模型之(4)

在《 编写实模式多任务操作系统模型之一》中,我们了解了X86模式的功能特点,运行机制并对程序模块进行了分析。本文中,我们将继续分析程序模块的进程调度子程序和其他辅助程序,并完成这个程序的编译及安装运行。

进程调度子程序scheduler

scheduler是系统的进程调度程序,是实现多任务关键的部分。它实质上是嵌入到系统时钟中断内来完成进程调度功能的。由于系统时钟以18.2次/秒的频率发生中断,这样每当时钟中断一发生,便可带动进程调度程序执行,所以这个OS模型是以时钟中断来驱动的。为了不影响原来时钟中断程序的例行工作,它开始运行时首先要调用位于ROMBIOS中的 0xF000:0xFEA5 处的时钟中断服务程序。返回后,它从current_task单元中找到当前被中断进程的进程号,根据该进程号在SPtable中找到其进程栈指针的存放地址,将其栈指针存入到该地址中,为下一次运行做好准备。而后将 current_task 加1,得到下一个将被调度运行的进程号。由该进程号在 SPtable 中找到上一次该进程被中断时的进程栈指针,将CPU的SP寄存器设为该值,这样堆栈指针便指向进程栈的栈顶。由于每次进程被中断运行时在进程栈顶都保存有断点处的CPU内部通用寄存器及ES和DS的值,此时将这些值恢复到相应的寄存器中,最后通过一条IRET指令便可将CPU的控制权转移到这一进程上,这个进程便重新从断点处重新运行。整个系统便在调度程序的控制下循环往复地运行,依次将CPU分时地切换到各个进程上。由于切换的速度较快,所以宏观上我们便看到几个进程在同时向前并行推进,互不影响。在微观上,几个进程轮流占用CPU,分时运行。

Scheduler初次被激活是Kernel全部初始化工作完成后。Kernel初始化工作完成后,各个进程堆栈空间布局均如图7所示的形式,其中“Task1偏移地址”单元中为相应进程入口地址的偏移地址。在Kernel程序中:

     
     jmp $        ; kernel在此等待时钟中断的到来


该指令相当一条无穷循环指令 while(1);,当时钟中断到来时,它将从无穷循环中转到scheduler去执行,而后每一次时钟中断都引起scheduler的运行,这时的各个进程堆栈空间布局仍有如图7所示的形式,只不过此时堆栈的底端由于进程的运行已经有进程所压入的数据,留下了进程运行过的痕迹,如图8所示。调度程序运行流程如图9所示。





具体工作步骤如下(假设调度程序运行前,CPU正处于task1的进程空间,SP指向task1的进程堆栈的栈顶,此时发生时钟中断,scheduler投入运行):

1.调度程序将task1进程断点处的CPU内部通用寄存器及ES和DS的值压入到task1进程堆栈中,代码如下:

     
     pusha
 push es
 push ds


2.向中断控制器8259发送EOI中断结束指令:

     
     mov al, 0x20
out 0x20, al


3.将标志寄存器Flag压入堆栈,调用位于ROMBIOS中的 0xF000:0xFEA5 处的原时钟中断服务程序,使原时钟中断服务程序完成其原有的工作,代码如下:

     
     pushf
call 0xF000:0xFEA5


由于原时钟中断为硬件中断,所以中断服务程序返回指令为iret。iret指令依次将栈顶字单元的内容弹出到IP、CS及Flag中,这样为了保证上述call指令的正确返回及堆栈不被破坏,所以要在call指令的前面加入pushf指令,以和iret的动作相配合。

4.保存将被剥夺执行权的task1进程堆栈指针。由于进程堆栈中保存有进程被中断时的断点信息,而其它进程运行时也要使用CPU内部的SP寄存器,所以在进行任务切换前要做进程的堆栈指针的保存工作。如下指令所示:

     
     mov ax, [current_task]
mov bx, ax
shl bx, 1	
lea si, [SPtable]
mov [ds:si + bx], SP


在current_task内存中存放当前运行进程的进程号,以为索引可以在 SPTABLE 数组中找到该进程堆栈指针的存放地址,即进程堆栈指针的存放地址=SPtable+2*进程号,找到该地址将进程断点处的SP存入其中。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值