📄 02.htm
字号:
href="http://linux.ccidnet.com/pub/disp/Column?columnID=293"
target=_blank><IMG height=18 src="02.files/button3_top.gif" width=66
border=0 name=Image173></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="02.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="02.files/button4_top.gif" width=66
border=0 name=Image174></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="02.files/line.gif"
width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><IMG height=18 src="02.files/button5_bottom.gif"
width=50 border=0 name=Image165></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="02.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="02.files/button6_top.gif" width=50
border=0 name=Image176></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13 src="02.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="02.files/button7_top.gif" width=80
border=0 name=Image177></A></DIV></TD>
<TD width=17 bgColor=#ffffff height=22><IMG height=24
src="02.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="02.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="02.files/printer.gif" width=24 border=0>打印</A> <A
class=content01 href="javascript:document.sendmail.submit()"><IMG
title=发给朋友 height=18 src="02.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="02.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>编写实模式多任务操作系统模型之一(2)</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\02.files\ad(3).htm"
frameBorder=0 noResize width=360 scrolling=no height=300></IFRAME>
<CENTER><FONT
color=#000099><STRONG>程序模块分析</STRONG></FONT></CENTER><BR><BR>本操作系统模型由两个程序组成,一个为引导程序boot.asm,另一个为内核程序kernel.asm。其中引导程序位于软盘的引导扇区,主要功能为将Kernel从盘上读入内存,让其运行;Kernel则依次使3个进程占用CPU,完成各自的工作。
<BR><BR><B>引导程序boot.asm</B>
<BR><BR>引导程序boot.asm位于引导软盘的0面0道1扇区,共计512个字节长度。该段程序在系统通电自检完成后,将由ROMBIOS读到内存的0000:7c00h地址处,并从该地址开始执行。该程序运行后将首先将自身移动到高端内存区9000:7c00h,留出低端内存区以备功能扩展时使用,而后转到高端内存区执行。接着对引导驱动器复位,利用int
13h的物理读盘功能,将位于0头0道2扇区及3扇区的kernel程序读入内存
8000:0000h地址处。若读盘失败,则进行3次尝试;若仍未读出,则显示“kernel Loading failed ! Any
key to reboot...”
信息,而后重新启动;若读盘成功,则跳到kernel程序的入口点8000:0000h地址处执行。程序流程如图1所示。 <BR><BR>
<CENTER><IMG
src="02.files/60145.gif"></CENTER><BR><BR>boot.asm执行后的内存布局如图2所示。由于在实模式下编程,程序可访问的内存空间为1MB,绝对地址从00000H~FFFFFH,其中低端内存及高端内存的部分区域已经被系统占用,程序可用的内存区为位于高端及低端的中间部分。由于本程序规模较小,内存空间足够用。对于本程序,高端97C00H~97DFFH为引导程序自搬移后的位置,80000H~803FFH为成功读入的内核代码所占的内存空间。
<BR><BR>
<CENTER><IMG
src="02.files/60146.gif"></CENTER><BR><BR>boot.asm的程序代码及详细注释如下:
<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>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; boot.asm - OS 引导扇区程序Bootloader
;; 功能: 将自身移动至内存高端,而后将启动盘上的kernel读到内存,
;; 接着跳转到kernel....
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[BITS 16] ;实模式 16bit 代码结构
; 标号等价伪定义
INITSEG EQU 0x07c0 ; 启动扇区段地址
NEWSEG EQU 0x9000 ; 引导程序移动到的高端段地址
KERNELSEG EQU 0x8000 ; kernel段地址
KERNELOFFSET EQU 0x0000 ; kernel偏移地址
REBOOTSEG EQU 0XFFFF ; 重启动段地址
REBOOTOFFSET EQU 0X0000 ; 重启动偏移地址
org 0x7c00 ; 汇编起始地址
start:
jmp short bootup ;跳转到启动代码
; 数据区
; 变量定义
bootdrv db 0 ;bootdrv用于保存启动驱动器号
retries db 3 ;重复读盘次数
;系统启动信息
bootmsg db "System bootup ... ",0dh,0ah,00h
; kernel loading 信息
loadknlmsg db "Loading kernel ... ",0dh,0ah,00h
; kernel loading 错误信息
loadknlerrmsg db "Kernel loading failed !",0dh,0ah,"Any key to
reboot...",0dh,0ah,00h
bootup:
mov [bootdrv], dl ; 保存启动驱动器号
; 显示启动信息
mov si, bootmsg
call dispstr
; 将自身的所有程序及数据由 0000:7c00h 移动到
; 内存高端 9000:7c00h,总计 512 字节长度
cld ; 方向标志置 0,
mov ax, NEWSEG ; ax=0x9000
mov es, ax ; 附加段寄存器es设为 0x9000,所移数据的目的段
mov di, start ; 目的变址寄存器 =7c00h
mov si, start ; 源变址寄存器 = 7c00h
mov cx, 0x200 ; 移动总字节长度 512 Bytes
cli ; 禁止中断
rep movsb ; 执行移动操作
; 跳转到移动后的新段,从 there 地址开始执行.
JMP NEWSEG:there
there: ;这里是新的执行起始点.
sti ;开中断
;下一步,将kernel 程序从启动驱动器的读到内存中,而后由kernel接管控制.
mov si,loadknlmsg
call dispstr ;显示kernel 加载信息"kernel loading..."
readagain:
mov ah, 0
mov dl, [bootdrv]
int 0x13 ; 复位启动驱动器
; 将位于从物理2扇区开始的2个扇区的kernel 程序从启动驱动器的读到内存中
; KERNELSEG:0000h
cld ; 方向标志置 0
mov bx, KERNELOFFSET ; kernel 地址偏移
mov ax, KERNELSEG ; kernel 段地址 0x8000
mov es, ax
mov ax, 0x0202 ; AH = 02 (读扇区功能号), AL=2 (扇区数)
mov cx, 0x0002 ; CH - 磁道号, CL - 逻辑扇区号
mov dh, 0 ; DH - 磁头号
mov dl, [bootdrv] ; DL - 驱动器号
int 0x13 ; 读扇区 BIOS 调用
jnc gotoknl ; 无错误则进入kernel执行
dec byte [retries] ; 读盘计数器减1
jnz readagain ; 未到最大读盘次数,则继续读
mov si,loadknlerrmsg ; 到达最大读盘次数仍然读盘有错,
call dispstr ; 则显示错误信息
mov ah,0
int 16h ; 等待用户输入任一键
jmp REBOOTSEG:REBOOTOFFSET ; 重新启动
gotoknl:
jmp KERNELSEG:KERNELOFFSET ; 跳到内核代码去执行,启动扇区引导程序结束.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;字符串显示子程序 dispstr
;参数:si=字符串首地址,字符串以00h作为结束标记
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dispstr:
push ax
mov ah, 0eh
dispnext:
lodsb
cmp al,0
jz quit
int 10h
jmp dispnext
quit: pop ax
ret
times 510-($-$$) db 0 ; 将空闲的程序区域填充为 00h
dw 0xaa55 ; 由BIOS检测的有效的启动扇区标志
;boot.asm结束</CCID_CODE></PRE></TD></TR></TBODY></TABLE></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=1"><<上一页</A></SPAN>
<A class=content01
href="http://linux.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=1">1</A>
<FONT color=#ff0000>2</FONT> <A class=content01
href="http://linux.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=3">3</A>
<SPAN class=content01><A class=content01
href="http://linux.ccidnet.com/pub/disp/Article?columnID=303&articleID=35451&pageNO=3">下一页>></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="02.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="02.files/a_nav.gif"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -