Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1945532
  • 博文数量: 383
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 4061
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-24 18:53
文章分类

全部博文(383)

文章存档

2011年(1)

2010年(9)

2009年(276)

2008年(97)

我的朋友

分类: LINUX

2009-05-18 13:27:40

本文主要阐述利用Bochs和Grub,如何搭建一个操作系统的调试环境和发布。

如果你需要寻找的是如果开发环境创建,十分抱歉,本文并不会起任何作用,请直接忽略。

开发自己的操作系统是大部分计算机爱好者所向往的。操作系统也是软件,同样必须进行调试和测试。然而,操作系统的调试并没有想象中容易,我们必须依靠虚拟机。显然VMWare并不是我们的最佳选择。虽然它在速度上有着无可比拟的优势,但在调试方面却显得相形见绌。而且它的大块头并不是我们想要的。经过筛选,我选中了Bochs。Bochs在调试方面有着巨大的优势,内置反汇编,单步调试,并且能结合gdb对C代码进行单步,而且它还支持NE2000虚拟网卡。

操作系统的开发其实不必从头开始(也很难从头开始)。特别是BootLoader(系统装载程序),它本来就是一个细小而完整的操作系统。如果你真的认为BootLoader是必须重写的,也可以推迟到操作系统的内核编写后再重写,这完全是可以的。所以我们需要一个BooLoader。为了调试和发布的方便,BootLoader必须支持从网络加载内核。我选择了Grub(或者你可以选择[url=]gPXE[/url],这是一个纯网络BootLoader)。Okay,开始吧。

正文:

1.首先,我们必须下载grub和bochs的源代码包来重新编译。我用的是grub-0.97和bochs-2.3.5(我没有用最新的bochs-2.3.6,因为在我的机器上编译有问题,如果你想,可以试试2.3.6)。

2.解压grub-0.97.tar.gz。进入源代码目录进行编译,命令如下:
        引用:
        [table=98%]        [tr]                [td]                                                        $ ./configure --enable-ne --enable-ne-scan=0x220
$ make                                        [/td]        [/tr]        [/table]
--enable-ne选项的意思是启动Ne2000网络模块,这是因为bochs的网卡是Ne2000。
--enable-ne-scan=0x220选项是网卡的端口地址,不一定是0x220,可以是其他,但该值必须和bochsrc里面的值相同,后面会有提及。

3.编译完后,我们要将stage1和stage2做成一个img文件,以便bochs能加载。制作过程如下:
    a.先创建一个10M大小的镜像文件,命令如下:
        dd if=/dev/zero of=grub.img bs=512 count= 20160
    b.然后将文件装载为回环设备:
        losetup /dev/loop0 grub.img
    c.将stage1和stage2写入回环设备
        cat ./stage1/stage1 ./stage2/stage2 > /dev/loop0
    d.卸载回环设备
        losetup -d /dev/loop0
至此,grub的准备工作完毕。下面继续bochs的准备工作。

4.解压bochs源代码,进入目录进行编译,命令如下:
        引用:
        [table=98%]        [tr]                [td]$ ./configure --prefix=/opt/bochs --with-all-libs --enable-plugins--enable-ne2000 --enable-vbe --enable-debugger --enable-disasm

$ make                                        [/td]        [/tr]        [/table]
su切换到root用户,然后
        引用:
        [table=98%]        [tr]                [td]                                                        $ make install                                        [/td]        [/tr]        [/table]
--prefix=/opt/bochs 选项是指定bochs的安装位置,你可以自行选择。
--with-all-libs 自动选择所需要的库
--enable-plugins 启动插件,必须
--enable-ne2000 启动ne2000的虚拟网络
--enable-vbe 启动Vesa Bios
--enable-debugger 启动内置调试器
--enable-disasm 打开反汇编
更多的选项请参考官方文档:[url=http://bochs.sourceforge.net/cgi-bin/topper.pl?name=New+Bochs+Documentation&url=http://bochs.sourceforge.net/doc/docbook/user/index.html]点我[/url]

5.bochs编译安装后。将步骤3生成的grub.img文件复制到/opt/bochs/share/bochs/目录下。并在该目录创建一个bochsrc文件。这是bochsrc的配置文件。附上我的文件内容给大家参考:
        引用:
        [table=98%]        [tr]                [td]                                                        # edit these to point to the latest bios files
romimage: file=$BXSHARE/BIOS-bochs-legacy, address=0xf0000
vgaromimage: file=$BXSHARE/VGABIOS-elpin-2.40
floppya: 1_44=/dev/fd0:, status=inserted
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path=$BXSHARE/hda.img, cylinders=20, heads=16, spt=63
megs: 32
boot: disk
vga_update_interval: 30000
keyboard_serial_delay: 20000
keyboard_paste_delay: 100000
floppy_command_delay: 50000
ips: 500000
#realtime_pit: 0
mouse: enabled=0
#ne2k: ioaddr=0x280, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=xl0
ne2k: ioaddr=0x220, irq=3, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth1
log: bochsout.txt
panic: action=ask
error: action=report
info: action=report
debug: action=ignore                                        [/td]        [/tr]        [/table]
[b]需要注意的是ne2k的那行。其中ioaddr=0x220,就是刚才在编译时候指定的端口地址,若不同,则需要修改。[/b]

6.配置tftp服务和dhcp服务从略。请参考论坛的其他文章。

7.启动bochs,装入配置文件bochsrc,开始模拟。若刚才整个过程没有出错,bochs会运行grub,并有"grub>"提示符。输入命令:dhcp(网络上需要有dhcp服务器),grub能为网卡获取地址。然后输入命令:
        引用:
        [table=98%]        [tr]                [td]                                                        tftpserver 192.168.1.2
kernel (nd)/kernel
boot                                        [/td]        [/tr]        [/table]
192.168.1.2 为ftp服务器地址
kernel 为内核文件名

这样,Bochs就能从网络上加载内核并启动。利用内置的调试器就能方便的对内核进行调试。

若需要到硬件环境进行测试,只需要将grub修改--enable-ne选项,指定机器的网卡,并从新编译。再用命令cat stage1stage2 > /dev/fd0 把stage1stage2写入到软盘。利用软盘启动测试机器,在测试机器上通过网络加载内核。避免了每一次修改内核,就要将内核重新写入软盘。

后记:
搭建运行环境只是开发操作系统的第一步。我会陆续的将得到经验总结,并与大家分享。希望能与更多的操作系统爱好者交流。
email,msn:future0906[at]gmail[dot]com
qq:231725801

参考资料:
[b][url=http://blog.csdn.net/waterpub/archive/2006/03/29/643414.aspx]bochs使用(linux下搭建操作系统开发环境,原创)[/url]
[url=]创建自己的操作系统开发环境[/url]
[url=http://www.cublog.cn/u/1260/showart.php?id=112482]Linux 0.11调试向导[/url][/b]
阅读(1802) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~