📄 3.htm
字号:
border=0><TBODY>
<TR>
<TD width=27 bgColor=#4786bc height=22><IMG height=24
src="3.files/left_yuan.gif" width=33></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><A
onmouseover="MM_swapImage('Image171','','../images/developers/button1_bottom.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://linux.ccidnet.com/pub/disp/Column?columnID=288"
target=_blank><IMG height=18 src="3.files/button1_top.gif" width=66
border=0 name=Image171></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="3.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://linux.ccidnet.com/pub/disp/Column?columnID=290"
target=_blank><IMG height=18 src="3.files/button2_top.gif" width=66
border=0 name=Image172></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="3.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://linux.ccidnet.com/pub/disp/Column?columnID=293"
target=_blank><IMG height=18 src="3.files/button3_top.gif" width=66
border=0 name=Image173></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="3.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://linux.ccidnet.com/pub/disp/Column?columnID=296"
target=_blank><IMG height=18 src="3.files/button4_top.gif" width=66
border=0 name=Image174></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="3.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><IMG height=18 src="3.files/button5_bottom.gif"
width=50 border=0 name=Image165></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="3.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://linux.ccidnet.com/pub/disp/Column?columnID=315"
target=_blank><IMG height=18 src="3.files/button6_top.gif" width=50
border=0 name=Image176></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="3.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="3.files/button7_top.gif" width=80
border=0 name=Image177></A></DIV></TD>
<TD width=17 bgColor=#ffffff height=22><IMG height=24
src="3.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="3.files/triangle.gif"
width=11> 当前页面位置:<A class=link
href="http://www.ccidnet.com/">主页</A> :<A class=link
href="http://linux.ccidnet.com/pub/disp/Column?columnID=287&pageNO=1">开发者</A>:<A
class=link
href="http://linux.ccidnet.com/pub/disp/Column?columnID=301&pageNO=1">Linux</A>:<A
class=link
href="http://linux.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:23:33" name=publish_time> <INPUT type=hidden
value=Article?columnID=303&articleID=35451&pageNO=1
name=link> </FORM><IMG height=5 src="" width=5><BR><A
class=content01 href="javascript:self.print()"><IMG title=打印
height=18 src="3.files/printer.gif" width=24 border=0>打印</A> <A
class=content01 href="javascript:document.sendmail.submit()"><IMG
title=发给朋友 height=18 src="3.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="3.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>编写实模式多任务操作系统模型之一(3)</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\3.files\ad(3).htm"
frameBorder=0 noResize width=360 scrolling=no
height=300></IFRAME><B>内核程序kernel.asm</B>
<BR><BR>kernel.asm是系统的核心程序,主要由任务初始化子程序taskinit、进程调度子程序scheduler、键盘中断子程序keybd、16进制数显示子程序printhex及3个参与被调度程序task1~task3等几部分组成,其中进程调度子程序是多任务实现的关键。
<BR><BR>内核的工作方式是在系统时钟中断的驱动下,依次使3个进程分别得到调度,使其分时占用CPU完成各自的工作—在屏幕的不同位置分别显示各自的计数器值,即在某一时刻实际只有一个进程在运行,其余的进程都处于挂起状态。被挂起进程的断点信息,如断点地址、断点处的CPU内的各个寄存器状态,均被保存在各进程的堆栈内。这样当挂起进程再次被调度运行时,调度程序将断点的信息恢复出来,挂起进程便接着断点继续运行。内核进程调度如图3所示。
<BR><BR>
<CENTER><IMG
src="3.files/60147.gif"></CENTER><BR><BR>Kernel程序运行时的内存布局图4所示。
<BR><BR>
<CENTER><IMG
src="3.files/60148.gif"></CENTER><BR><BR>图4是图2中的Kernel内存区(80000H~803FF)的放大显示,从图中可见在80000H~8FFFFH的64KB内存区中,低端的1KB区域80000H~803FFH为Kernel的所有程序及数据区。Kernel程序区部分有用于演示目的的3个进程代码。当这3个进程被初始化时,分别给每一个进程分配了各自独立的、长度为1KB的3个堆栈区,如图4中的文字标记所示。分配给进程的堆栈区主要用于保存各自被中断运行时的断点及返回信息。在进行进程切换时,要进行进程堆栈空间的切换,这些进程堆栈区是实现多任务功能的重要内存区。Kernel堆栈区位于内存的高端,足以满足程序运行的需要。
<BR><BR>Kernel程序运行流程如图5所示。Kernel在运行时,首先做相关的初始化工作,主要包括数据段、堆栈段寄存器初始化,将其均设定为Kernel的段地址;堆栈指针设在内存的高端;关软盘马达;清屏;初始化3
个进程,使其处于运行就绪状态;重新设置定时器及键盘中断向量;而后在时钟中断的驱动下调度程序运行,使3个进程task1~task3分别运行。
<BR><BR>
<CENTER><IMG
src="3.files/60149.gif"></CENTER><BR><BR><B>任务初始化子程序Taskinit</B>
<BR><BR>Taskinit子程序是用来初始化一个进程的,使一个进程成为运行就绪状态。其所需要的参数有两个:一个为进程的入口地址,另一个为该进程设定的堆栈指针。这两个参数分别送入ax及dx寄存器,利用call指令调用该子程序便可初始化一个进程。在kernel中将进程的可用堆栈区设为绝对地址为
80600H 以上的内存区,每个进程拥有1KB(400H)的堆栈区,这样第一个进程的堆栈指针就设为80A00H,因为 X86
CPU堆栈的增长方向是指向低地址的。如下指令可用来初始化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>mov dx, 0x0600 ; 进程的堆栈基地址
add dx, STACKSIZE ; 进程1的堆栈指针 = 0xa00
mov ax, task1 ; 进程1入口地址
call taskinit ; 初始化task1</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>进入Taskinit后要完成的工作如下:
<BR><BR>1.在Kernel堆栈区保存CPU的通用寄存器ax、cx、bx、dx、SP、bp、si、di及ES和DS。
<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>此时Kernel堆栈区如图6状态。
<BR><BR>
<CENTER><IMG
src="3.files/60150.gif"></CENTER><BR><BR>2.将堆栈指针SP用进程的堆栈指针代替,堆栈指针SP指向进程的堆栈,模拟中断发生时的堆栈操作,在进程的堆栈区先压入标志寄存器,CS及进程的入口地址(在AX中),而后再压入中断发生时要保护的通用寄存器及ES和DS,此时进程堆栈状态如图7所示。
<BR><BR>
<CENTER><IMG
src="3.files/60151.gif"></CENTER><BR><BR>由于在调度程序scheduler中,当其选中了一个将要被调度运行的进程后,它将从SPtable中找到该进程的堆栈指针,并将CPU的堆栈指针寄存器SP设定为该进程的堆栈指针,这样SP便指向了进程的堆栈空间。在以后恢复现场工作时,将进程堆栈空间内所压入的值恢复到相应的寄存中,最后的一条中断返回指令iret将把进程被中断的断点及标志分别送到IP、CS及标志寄存器中,这样该进程便得以占用CPU,获得运行权,运行自已的程序。
<BR><BR>3.将进程堆栈指针SP保存到数据区的SPtable中。SPtable是一个数组,每个单元2个字节,专用于保存被剥夺运行权的、进程断点处堆栈指针SP的值。在进程被首次初始化时,其保存有进程序堆栈空间的栈顶地址,按进程初始化的先后顺序依次保存,如表1所示。
<BR><BR>
<CENTER>表1 SPtable保存有进程序堆栈空间栈顶地址</CENTER><BR><BR>
<CENTER><CCID_NOBR>
<TABLE class=content width=502 border=1>
<TBODY>
<TR>
<TD>SPtable</TD>
<TD>SPtable+2</TD>
<TD>SPtable+4</TD></TR>
<TR>
<TD>Task1堆栈指针SP</TD>
<TD>Task2堆栈指针SP</TD>
<TD>Task3堆栈指针SP</TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>4.恢复SP为Kernel堆栈区的堆栈指针,将在第1步中保存的各寄存器值出栈,返回到调用程序。
<BR><BR>5.各个进程初始化后,各自的堆栈空间均如第2步中所示的状态。 <BR><BR>在<A
href="http://developer.ccidnet.com/pub/disp/Article?columnID=303&articleID=35453&pageNO=1"
target=_blank>下一篇文章</A>中,我们将继续进行程序模块的分析,并完成程序的编译和安装运行。 <BR><BR>(责任编辑
<CCID_NOBR><A
href="mailto:huangxf@staff.ccidnet.com">Sunny</A></CCID_NOBR>)
</SPAN>
<P align=center> <BR><SPAN class=content01><A class=content01
href="http://linux.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=2"><<上一页</A></SPAN>
<A class=content01
href="http://linux.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=1">1</A>
<A class=content01
href="http://linux.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=2">2</A>
<FONT color=#ff0000>3</FONT> </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="3.files/a_nav.gif" width=7><A
class=Name02
href="http://linux.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="3.files/a_nav.gif" width=7><A
class=Name02
href="http://linux.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="3.files/a_nav.gif" width=7><A
class=Name02
href="http://linux.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="3.files/a_nav.gif" width=7><A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -