📄 04.htm
字号:
href="http://developer.ccidnet.com/pub/disp/Column?columnID=288"
target=_blank><IMG height=18 src="04.files/button1_top.gif" width=66
border=0 name=Image171></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="04.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><A
onmouseover="MM_swapImage('Image172','','../images/developers/button2_bottom.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://developer.ccidnet.com/pub/disp/Column?columnID=290"
target=_blank><IMG height=18 src="04.files/button2_top.gif" width=66
border=0 name=Image172></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="04.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><A
onmouseover="MM_swapImage('Image173','','../images/developers/button3_bottom.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://developer.ccidnet.com/pub/disp/Column?columnID=293"
target=_blank><IMG height=18 src="04.files/button3_top.gif" width=66
border=0 name=Image173></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="04.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><A
onmouseover="MM_swapImage('Image174','','../images/developers/button4_bottom.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://developer.ccidnet.com/pub/disp/Column?columnID=296"
target=_blank><IMG height=18 src="04.files/button4_top.gif" width=66
border=0 name=Image174></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="04.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><IMG height=18 src="04.files/button5_bottom.gif"
width=50 border=0 name=Image165></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="04.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><A
onmouseover="MM_swapImage('Image176','','../images/developers/button6_bottom.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://developer.ccidnet.com/pub/disp/Column?columnID=315"
target=_blank><IMG height=18 src="04.files/button6_top.gif" width=50
border=0 name=Image176></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="04.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><A
onmouseover="MM_swapImage('Image177','','../images/developers/button7_bottom.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://bbs.ccidnet.com/forumdisplay.php?forumid=13"
target=_blank><IMG height=18 src="04.files/button7_top.gif" width=80
border=0 name=Image177></A></DIV></TD>
<TD width=17 bgColor=#ffffff height=22><IMG height=24
src="04.files/right_yuan.gif" width=18></TD></TR></TBODY></TABLE><!-- 包含菜单结束-->
<TABLE cellSpacing=0 cellPadding=0 width=580 align=center border=0>
<TBODY>
<TR>
<TD class=content vAlign=top colSpan=2 height=20><IMG height=5
src="" width=5><BR><!-- 包含导航开始--><!-- 模版文件头 结束 -->
<TABLE class=content01 cellSpacing=1 width=414 border=0>
<TBODY>
<TR>
<TD width="100%"><IMG height=10 src="04.files/triangle.gif"
width=11> 当前页面位置:<A class=link
href="http://www.ccidnet.com/">主页</A> :<A class=link
href="http://developer.ccidnet.com/pub/disp/Column?columnID=287&pageNO=1">开发者</A>:<A
class=link
href="http://developer.ccidnet.com/pub/disp/Column?columnID=301&pageNO=1">Linux</A>:<A
class=link
href="http://developer.ccidnet.com/pub/disp/Column?columnID=303&pageNO=1"><B>技术开发</B></A><B>:文章</B>
</TD></TR></TBODY></TABLE><!-- 包含导航结束--></TD>
<TR>
<TD colSpan=2 height=10></TD></TR>
<TR bgColor=#7e99a4>
<TD colSpan=2 height=2></TD></TR>
<TR>
<TD class=content vAlign=top colSpan=2 height=15>
<DIV align=right><!-- 包含发送email开始-->
<FORM name=sendmail
action=http://club.ccidnet.com/send_to_friend.php3 method=post
target=_blank><INPUT type=hidden value=编写实模式多任务操作系统模型之二 name=title>
<INPUT type=hidden value="高克强 王兴泰" name=author> <INPUT type=hidden
value="2002.12.31 11:20:57" name=publish_time> <INPUT type=hidden
value=Article?columnID=303&articleID=35453&pageNO=1
name=link> </FORM><IMG height=5 src="" width=5><BR><A
class=content01 href="javascript:self.print()"><IMG title=打印
height=18 src="04.files/printer.gif" width=24 border=0>打印</A> <A
class=content01 href="javascript:document.sendmail.submit()"><IMG
title=发给朋友 height=18 src="04.files/comment.gif" width=24
border=0>发给朋友</A> <A class=content01
href="http://club.ccidnet.com/remark.php3?channel=303&title=编写实模式多任务操作系统模型之二"><IMG
title=发表评论 height=18 src="04.files/send.gif" width=24
border=0>发表评论</A> <!-- 包含发送email结束--></DIV></TD></TR><!-- 包含文章开始--><!-- 文章显示 -->
<TR>
<TD class=content vAlign=top width=19></TD>
<TD class=content vAlign=top width=561><IMG height=5 src=""
width=5><BR><SPAN
class=p16><B>编写实模式多任务操作系统模型之二(1)</B></SPAN><BR>作者:高克强 王兴泰
本文选自:开放系统世界——赛迪网 2002年12月31日 </TD></TR>
<TR>
<TD class=content vAlign=top width=19></TD>
<TD class=content vAlign=top width=561 height=144><BR><SPAN
class=p11b><IFRAME align=right marginWidth=0 marginHeight=0
src="C:\Documents and Settings\Administrator\My Documents\freeos\temp\os\04.files\ad(3).htm"
frameBorder=0 noResize width=360 scrolling=no
height=300></IFRAME>在《<A
href="http://developer.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=1"
target=_blank>编写实模式多任务操作系统模型之一</A>》中,我们了解了X86模式的功能特点,运行机制并对程序模块进行了分析。本文中,我们将继续分析程序模块的进程调度子程序和其他辅助程序,并完成这个程序的编译及安装运行。
<BR><BR><B>进程调度子程序scheduler</B>
<BR><BR>scheduler是系统的进程调度程序,是实现多任务关键的部分。它实质上是嵌入到系统时钟中断内来完成进程调度功能的。由于系统时钟以18.2次/秒的频率发生中断,这样每当时钟中断一发生,便可带动进程调度程序执行,所以这个OS模型是以时钟中断来驱动的。为了不影响原来时钟中断程序的例行工作,它开始运行时首先要调用位于ROMBIOS中的
0xF000:0xFEA5
处的时钟中断服务程序。返回后,它从current_task单元中找到当前被中断进程的进程号,根据该进程号在SPtable中找到其进程栈指针的存放地址,将其栈指针存入到该地址中,为下一次运行做好准备。而后将
current_task 加1,得到下一个将被调度运行的进程号。由该进程号在 SPtable
中找到上一次该进程被中断时的进程栈指针,将CPU的SP寄存器设为该值,这样堆栈指针便指向进程栈的栈顶。由于每次进程被中断运行时在进程栈顶都保存有断点处的CPU内部通用寄存器及ES和DS的值,此时将这些值恢复到相应的寄存器中,最后通过一条IRET指令便可将CPU的控制权转移到这一进程上,这个进程便重新从断点处重新运行。整个系统便在调度程序的控制下循环往复地运行,依次将CPU分时地切换到各个进程上。由于切换的速度较快,所以宏观上我们便看到几个进程在同时向前并行推进,互不影响。在微观上,几个进程轮流占用CPU,分时运行。
<BR><BR>Scheduler初次被激活是Kernel全部初始化工作完成后。Kernel初始化工作完成后,各个进程堆栈空间布局均如图7所示的形式,其中“Task1偏移地址”单元中为相应进程入口地址的偏移地址。在Kernel程序中:
<BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=550
align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>jmp $ ; kernel在此等待时钟中断的到来</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>该指令相当一条无穷循环指令
while(1);,当时钟中断到来时,它将从无穷循环中转到scheduler去执行,而后每一次时钟中断都引起scheduler的运行,这时的各个进程堆栈空间布局仍有如图7所示的形式,只不过此时堆栈的底端由于进程的运行已经有进程所压入的数据,留下了进程运行过的痕迹,如图8所示。调度程序运行流程如图9所示。
<BR><BR>
<CENTER><IMG src="04.files/60165.gif"></CENTER><BR><BR>
<CENTER><IMG
src="04.files/60166.gif"></CENTER><BR><BR>具体工作步骤如下(假设调度程序运行前,CPU正处于task1的进程空间,SP指向task1的进程堆栈的栈顶,此时发生时钟中断,scheduler投入运行):
<BR><BR>1.调度程序将task1进程断点处的CPU内部通用寄存器及ES和DS的值压入到task1进程堆栈中,代码如下:
<BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=550
align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>pusha
push es
push ds</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>2.向中断控制器8259发送EOI中断结束指令:
<BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=550
align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>mov al, 0x20
out 0x20, al</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>3.将标志寄存器Flag压入堆栈,调用位于ROMBIOS中的
0xF000:0xFEA5 处的原时钟中断服务程序,使原时钟中断服务程序完成其原有的工作,代码如下:
<BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=550
align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>pushf
call 0xF000:0xFEA5</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>由于原时钟中断为硬件中断,所以中断服务程序返回指令为iret。iret指令依次将栈顶字单元的内容弹出到IP、CS及Flag中,这样为了保证上述call指令的正确返回及堆栈不被破坏,所以要在call指令的前面加入pushf指令,以和iret的动作相配合。
<BR><BR>4.保存将被剥夺执行权的task1进程堆栈指针。由于进程堆栈中保存有进程被中断时的断点信息,而其它进程运行时也要使用CPU内部的SP寄存器,所以在进行任务切换前要做进程的堆栈指针的保存工作。如下指令所示:
<BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=550
align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><CCID_CODE>mov ax, [current_task]
mov bx, ax
shl bx, 1
lea si, [SPtable]
mov [ds:si + bx], SP</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>在current_task内存中存放当前运行进程的进程号,以为索引可以在
SPTABLE
数组中找到该进程堆栈指针的存放地址,即进程堆栈指针的存放地址=SPtable+2*进程号,找到该地址将进程断点处的SP存入其中。
</SPAN>
<P align=center> <BR><FONT color=#ff0000>1</FONT> <A
class=content01
href="http://developer.ccidnet.com/pub/disp/Article?columnID=303&articleID=35453&pageNO=2">2</A>
<A class=content01
href="http://developer.ccidnet.com/pub/disp/Article?columnID=303&articleID=35453&pageNO=3">3</A>
<SPAN class=content01><A class=content01
href="http://developer.ccidnet.com/pub/disp/Article?columnID=303&articleID=35453&pageNO=2">下一页>></A></SPAN>
</P></TD></TR><!-- 包含文章结束--></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=580 align=center border=0>
<TBODY>
<TR>
<TD><A class=content
href="http://market.ccidnet.com/pub/disp/Column?columnID=380"><FONT
color=#0000ff>“中国IT市场情报中心”会员注册优惠月</FONT></A></TD></TR></TBODY></TABLE><!-- 包含相关文章开始-->
<TABLE
style="BORDER-RIGHT: #e2e3e4 1px solid; BORDER-TOP: #e2e3e4 1px solid; BORDER-LEFT: #e2e3e4 1px solid; BORDER-BOTTOM: #e2e3e4 1px solid"
cellSpacing=0 cellPadding=0 width=580 align=center border=0>
<TBODY>
<TR>
<TD class=content bgColor=#e2e3e4 height=21>相关文章</TD></TR>
<TR>
<TD bgColor=#ffffff>
<TABLE class=Name02 cellSpacing=2 cellPadding=2 width="100%"
border=0>
<TBODY>
<TR>
<TD height=23><IMG height=7 src="04.files/a_nav.gif"
width=7><A class=Name02
href="http://developer.ccidnet.com/pub/disp/Article?columnID=302&articleID=35451&pageNO=1">
编写实模式多任务操作系统模型之一</A> <SPAN
class=content01>(2002.12.31)</SPAN></TD></TR>
<TR>
<TD height=23><IMG height=7 src="04.files/a_nav.gif"
width=7><A class=Name02
href="http://developer.ccidnet.com/pub/disp/Article?columnID=743&articleID=35411&pageNO=1">
推进Linux发展 服务信息化</A> <SPAN
class=content01>(2002.12.31)</SPAN></TD></TR>
<TR>
<TD height=23><IMG height=7 src="04.files/a_nav.gif"
width=7><A class=Name02
href="http://developer.ccidnet.com/pub/disp/Article?columnID=308&articleID=35029&pageNO=1">
Linux时代来临,您的企业准备好了吗?</A> <SPAN
class=content01>(2002.12.26)</SPAN></TD></TR>
<TR>
<TD height=23><IMG height=7 src="04.files/a_nav.gif"
width=7><A class=Name02
href="http://developer.ccidnet.com/pub/disp/Article?columnID=302&articleID=35019&pageNO=1">
Linux、开放源码软件与公共政策</A> <SPAN
class=content01>(2002.12.26)</SPAN></TD></TR>
<TR>
<TD height=23><IMG height=7 src="04.files/a_nav.gif"
width=7><A class=Name02
href="http://developer.ccidnet.com/pub/disp/Article?columnID=382&articleID=34520&pageNO=1">
Linux重点行业应用市场份额统计</A> <SPAN
class=content01>(2002.12.23)</SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- 包含相关文章结束--><BR><!-- 包含信息化大赛开始 --><!-- 包含信息化大赛结束 -->
<TABLE cellSpacing=0 cellPadding=0 width=580 align=center border=0>
<TBODY>
<TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -