📄 +
字号:
href="http://linux.ccidnet.com/pub/disp/Column?columnID=290"
target=_blank><IMG height=18
src="赛迪网--开发者--Linux--技术开发.files/button2_top.gif" width=66 border=0
name=Image172></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13
src="赛迪网--开发者--Linux--技术开发.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="赛迪网--开发者--Linux--技术开发.files/button3_top.gif" width=66 border=0
name=Image173></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13
src="赛迪网--开发者--Linux--技术开发.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="赛迪网--开发者--Linux--技术开发.files/button4_top.gif" width=66 border=0
name=Image174></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13
src="赛迪网--开发者--Linux--技术开发.files/line.gif" width=1></TD>
<TD bgColor=#cccc98 height=22>
<DIV align=center><IMG height=18
src="赛迪网--开发者--Linux--技术开发.files/button5_bottom.gif" width=50
border=0 name=Image165></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13
src="赛迪网--开发者--Linux--技术开发.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="赛迪网--开发者--Linux--技术开发.files/button6_top.gif" width=50 border=0
name=Image176></A></DIV></TD>
<TD bgColor=#cccc98 height=22><IMG height=13
src="赛迪网--开发者--Linux--技术开发.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="赛迪网--开发者--Linux--技术开发.files/button7_top.gif" width=80 border=0
name=Image177></A></DIV></TD>
<TD width=17 bgColor=#ffffff height=22><IMG height=24
src="赛迪网--开发者--Linux--技术开发.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="赛迪网--开发者--Linux--技术开发.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="2003.02.11 11:38:35" name=publish_time> <INPUT type=hidden
value=Article?columnID=303&articleID=37722&pageNO=1
name=link> </FORM><IMG height=5 src="" width=5><BR><A
class=content01 href="javascript:self.print()"><IMG title=打印
height=18 src="赛迪网--开发者--Linux--技术开发.files/printer.gif" width=24
border=0>打印</A> <A class=content01
href="javascript:document.sendmail.submit()"><IMG title=发给朋友
height=18 src="赛迪网--开发者--Linux--技术开发.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="赛迪网--开发者--Linux--技术开发.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>创建自己的操作系统开发环境</B></SPAN><BR>作者:雷岳俊
本文选自:开放系统世界—赛迪网 2003年02月11日 </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\赛迪网--开发者--Linux--技术开发.files\ad(3).htm"
frameBorder=0 noResize width=360 scrolling=no
height=300></IFRAME>对于进行操作系统开发的爱好者而言,最困难的事情之一就是不知道从何处下手开发。很多书籍对操作系统的原理进行了深入的阐述,但是似乎没有人一步一步地教爱好者如何由浅入深地了解这些概念。
<BR><BR>前几期中,已经有文章就这一问题进行了探讨,在此我想尽量不用面向编程的叙述方式,而只是向那些想要开发操作系统的爱好者介绍一些相关的工具和技巧。有兴趣的读者可以轻松获取想知道的资源,并且开始自己的设计和编程。
<BR><BR>你也许可能没有意识到,操作系统的开发实际上并不是从头开始的。编写一个可靠的引导装载程序(bootloader)本身就是一个非常系统的项目,因此我不建议初学者自己开发一个操作系统的引导装入程序,很多可靠的引导装载程序(例如Grub、LILO、ppcboot等)都是免费的。如果一定要坚持自己开发这一部分的内容,我建议把它推迟到项目的后期进行。在本文中,我将使用GNU
Grub。 <BR><BR>
<CENTER><FONT
color=#000099><STRONG>开发环境</STRONG></FONT></CENTER><BR><BR>为了使操作系统开发过程更加轻松,需要构建一个开发环境,这个环境应该满足以下几个要求:
<BR><BR>◆ 可以很快地对自己修改后的新内核进行编译; <BR><BR>◆ 不用重新启动用于开发的机器; <BR><BR>◆
不需要使用软盘作为操作系统的存储介质。
<BR><BR>本文将介绍很多可以满足上面这三个需求的环境。它由一台从事开发的机器和一台测试的机器组成,两个机器都位于同一网络之上。用于开发的机器应该装配有一套用于开发的编程工具:汇编和C编译器、一个连接器和“make”工具。还有一个我认为特别有用的工具就是模拟器,它可以帮助调试内核,并且允许很快对新加入的代码行进行测试。接下来,还需要一个TFTP服务器。该工具将允许通过具有TFTP能力的引导装载程序通过网络从开发的机器上下载新开发的内核。
<BR><BR>测试用的机器,这台机器所需要的只是一个网卡和一个支持TFTP的引导装载程序。 <BR><BR>
<CENTER><FONT
color=#000099><STRONG>设置开发环境</STRONG></FONT></CENTER><BR><BR><B>1.开发用的机器</B>
<BR><BR>选择的编程工具是: <BR><BR>◆ gcc 2.95.4 <BR><BR>◆ ld 2.13.90.0.10
<BR><BR>Bochs 1.4.1是一个x86模拟器。注意要使其支持调试模式,就要对其进行一些特定的编译。命令如下:
<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>$ ./configure --enable-x86-debugger
$ make</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>为了正确地使用Bochs,需要创建一个磁盘映像,它要有引导装载程序和文件系统。具体方法可参见《<A
href="http://developer.ccidnet.com/pub/disp/Article?columnID=303&articleID=25269&pageNO=1"
target=_blank>Linux上古典仍在流行</A>》之Bochs。
<BR><BR>TFTP服务器我选择的是atftpd,使用基于Linux的TFTP服务器是一件非常简单的事情。
<BR><BR><B>2.测试用的机器</B> <BR><BR>我选择的引导装载程序是GNU Grub
0.92,这里需要注意的是要让Grub的TFTP终端具有和网卡通信的能力。我用作测试的机器使用的是一个NE2000
ISA网卡,通过以下命令来实现这一目的: <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>$ ./configure --enable-ne --enable-ne-scan=0x220
$ make</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>请注意,如果使用的是即插即用PCI卡的话,配置起来要容易得多。现在你可以把Grub映像安装至测试用的机器MBR之上,或者是一个用于启动测试机器的软盘之上。我喜欢使用后者,因为用于测试的机器还要用于其它用途,所以不想将其安装于硬盘之上。操作如下:
<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>$ cat ./stage1/stage1 ./stage2/stage2 > /dev/fd0</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>然后,把软盘插入到测试用的机器中,并且看一看网卡是否能够被识别,可以通过手工配置或者使用dhcp服务器。
<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>grub> dhcp
Probing... [NE*000]
NE2000 base 0x220, addr 00:C0:A8:4E:5A:76
Address: 192.168.22.14
Netmask: 255.255.255.0
Server: 192.168.22.1
Gateway: 192.168.22.1</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>到此已经配置好用于测试的机器。
<BR><BR>
<CENTER><FONT
color=#000099><STRONG>测试开发环境</STRONG></FONT></CENTER><BR><BR>正如我前面提到的,主要的编程工作都要在这台机器上完成。所以,为了测试配置需要使用GNU
Grub自带的内核例程,这些例程位于/docs目录之下。
<BR><BR>内核来自三个源程序文件:boot.S、kernel.c和multiboot.h,可以通过以下命令来编译内核:
<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>$ gcc -I. -c ./boot.S
$ gcc -I. -c ./kernel.c
$ ld ./kernel.o ./boot.o -o kernel -Ttext 100000</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>下面做一简单的解释,multiboot是一个标准的定义向引导装载程序传递信息的途径。boot.S接收这些信息,然后配置一个堆栈,接着调用“cmain”函数。该函数会对VGA的显示进行设置,读取传递过来的信息,输出一些信息后退出该函数。接着boot.s会得到控制权,输出信息的过程终止,然后进入一个无限循环中。这是一个很简单的程序,读者如果有兴趣可以对这些代码进入深入的研究。
<BR><BR>
<CENTER><FONT
color=#000099><STRONG>使用Bochs</STRONG></FONT></CENTER><BR><BR>我的计划是首先挂载磁盘映像,然后拷贝内核的文件系统,随后卸载它,接着运行Bochs。具体命令如下:
<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># /sbin/losetup -o 32256 /dev/loop1 ./c.img
# /bin/mount -t ext2 /dev/loop1 /mnt/osdev/
# cp /docs/kernel /mnt/osdev
# umount /mnt/osdev/
# /sbin/losetup /dev/loop1 -d
$ bochs</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>这个过程也可以由makefile自动完成。在Grub中,使用下面的命令可实现这一功能:
<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>grub> kernel (hd0,0)/kernel
grub> boot</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR></STRONG></FONT>
<CENTER></CENTER>使用测试环境</STRONG></FONT>
<CENTER></CENTER><BR><BR>首先配置TFTP服务器,使得端可以获取所编写的内核:
<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># /usr/sbin/atftpd --daemon /home/bono/src/grub-0.92/docs</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>启动机器,按如上所示配置网络连接。接下来指定TFTP服务器的IP地址,并且定位内核映像。请注意,该选项可以通过dhcp服务器来设置。
<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>grub> tftpserver 192.168.22.36
Address: 192.168.22.14
Netmask: 255.255.255.0
Server: 192.168.22.36
Gateway: 192.168.22.1
grub> kernel (nd)/kernel
[Multiboot-elf, <0x100000:0x807:0x0>, <0x101808:0x0:0x4018>,
shtab=0x106190, entry=0x100568]
grub> boot</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>这时,一个类似于Bochs的界面就会出现在测试用的机器上。
<BR><BR>现在已经准备好了开发自己操作系统的环境,更多的信息可查阅相关的资料。下面是一些有着操作系统开发的资源:操作系统资源中心http://www.nondot.org/sabre/os/articles;Intel体系结构软件开发人员手册ftp://download.intel.com/design/PentiumII/manuals/24319202.pdf。
<BR><BR>(责任编辑 <CCID_NOBR><A
href="mailto:huangxf@staff.ccidnet.com">Sunny</A></CCID_NOBR>)
</SPAN>
<P align=center> <BR></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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -