新闻  |   论坛  |   博客  |   在线研讨会
手把手教你构建geekos实验环境:基于Linux和bochs
0750long | 2009-04-03 19:52:12    阅读:3228   发布文章

手把手教你构建geekos实验环境:基于Linux和bochs

 

没想到这么早就做课设了。操作系统的课设这么早就开始了,课还没过几节呢。

说来真有点烦,做实验是一个叫做EOS的系统(注:此EOS乃教育OS之简称也,非嵌入式OS也)。而做课设又是一个叫geekos的系统。

还好,老师给了些工具:bochs和geekos的源代码。不过环境的建立没有仔细写出来,得自己慢慢去搭建。

想来想去,还是在Linux系统吧,毕竟bochs也有Linux版本的。这里就以红旗6.0 SP2版本加上bochs-2.3-1,再加上geekos的源代码,来写一下实验环境的搭建。注意:如果不懂用终端,也不懂命令的话,我就无语了。建议去借鸟哥的私房菜看一下。

首先,得安装bochs,很简单,毕竟人家红帽子公司做了个叫rpm的东东,好用啊!安装如图:

点击开大图这样安装的缺省安装,环境变量已设置好了,不用我们管了。要看是不是成功安装了,在任意目录下输入:bochs,如图:

点击开大图

就说明成功安装了。

下面是写测试代码。Geekos共有七个项目,第0个项目很简单,这里拿它开刀。整个代码如下,注意,这里只是main.c里的代码。

/*

 * GeekOS C code entry point

 * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>

 * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>

 * Copyright (c) 2004, Iulian Neamtiu <neamtiu@cs.umd.edu>

 * $Revision: 1.51 $

 *

 * This is free software.  You are permitted to use,

 * redistribute, and modify it as specified in the file "COPYING".

 */

 

#include <geekos/bootinfo.h>

#include <geekos/string.h>

#include <geekos/screen.h>

#include <geekos/mem.h>

#include <geekos/crc32.h>

#include <geekos/tss.h>

#include <geekos/int.h>

#include <geekos/kthread.h>

#include <geekos/trap.h>

#include <geekos/timer.h>

#include <geekos/keyboard.h>

 

void EchoCount()

{

       Keycode keycode;

       int count;

       count = 0;

       Set_Current_Attr(ATTRIB(BLACK, RED));

       Print("Ctrl+q:quit\n");

       while (1)

       {

              if (Read_Key(&keycode))

              {

                     if ((keycode & 0x4000) == 0x4000)

                     {

                            if ((Wait_For_Key() & 0x00ff) == 'q')

                            {

                                   Set_Current_Attr(ATTRIB(BLACK, RED));

                                   Print("you had quit (^_^)\n");

                                   Exit(1);

                            }

                     }

                     else if ( !(keycode & KEY_SPECIAL_FLAG) && !(keycode & KEY_RELEASE_FLAG))

                     {

                            keycode &= 0xff;

                            count = count + 1;

                            Set_Current_Attr(ATTRIB(BLACK,CYAN));

                            Print("%c",(keycode == '\r') ? '\n':keycode);

                            if (keycode == '\r')

                            {

                                   count = count -1;

                                   Set_Current_Attr(ATTRIB(AMBER,BLUE));

                                   Print("The NO.you enter is : %d",count);

                                   Print("\n");

                                   count = 0;

                            }

                     }

              }                  

       }

}

 

/*

 * Kernel C code entry point.

 * Initializes kernel subsystems, mounts filesystems,

 * and spawns init process.

 */

void Main(struct Boot_Info* bootInfo)

{

    Init_BSS();

    Init_Screen();

    Init_Mem(bootInfo);

    Init_CRC32();

    Init_TSS();

    Init_Interrupts();

    Init_Scheduler();

    Init_Traps();

    Init_Timer();

    Init_Keyboard();

 

 

    Set_Current_Attr(ATTRIB(BLACK, BLUE|BRIGHT));

    Print("=====>>Welcome to GeekOS!<<=====\n");

    Print("=====>>Hello from FightNow! team<<=====\n\n");

    Set_Current_Attr(ATTRIB(BLACK, GRAY));

 

  /*  TODO("Start a kernel thread to echo pressed keys and print counts");*/

 

       //new here

       // 创建线程,EchoCount是上面的函数。

       struct Kernel_Thread *kerThd;

       kerThd = Start_Kernel_Thread(&EchoCount,0,PRIORITY_NORMAL,false);  

    /* Now this thread is done. */

    Exit(0);

}

下一步编译,在build目录下,直接make就行了。如图:

 

点击开大图

注意最后一行,Makefile将几个.bin文件都重导向到了fd.img了,这个东东就是bochs运行时所要的映像文件了。在这一步如果有错,就得修改错误了。这些就不用教了。

下一步是修改bochs的配置文件,在build目录下,文件名字叫.bochsrc,在终端直接vim .bochsrc进入文件修改。要注意的就是路径的问题了,看下面注释。整个文件如下:

# An example .bochsrc file.

 

# You will need to edit these lines to reflect your system.

#这里是vgarom和rom的所在之处,就是VGABIOS-lgpl-latest和BIOS-bochs-latest的目录

vgaromimage: file= /usr/share/bochs/VGABIOS-lgpl-latest

romimage: file="/usr/share/bochs/BIOS-bochs-latest", address="0xf0000"

 

megs: 8

boot: a

 

 

floppya: 1_44=fd.img, status="inserted"

#floppya: 1_44=fd_aug.img, status="inserted"

 

log: ./bochs.out

keyboard_serial_delay: 200

floppy_command_delay: 500

vga_update_interval: 300000

ips:  1000000

mouse: enabled="0"

private_colormap: enabled="0"

i440fxsupport: enabled="0"

#这里不能要,因为项目0没用到硬盘

#newharddrivesupport: enabled="1"

 

# Uncomment this to write all bochs debugging messages to

# bochs.out.  This produces a lot of output, but can be very

# useful for debugging the kernel.

#debug: action="report"

修改成功之后,就可以运行了bochs了,在build目录直接输入bochs:

 

点击开大图

在这里输入6——里面说得很清楚了,看不明白不能怪我了。

看了下会有什么结果:

 

点击开大图

成功,任务完成。

Geekos的project0一共就30多个文件,还得一些心思去看才行,毕竟才完成了第一个项目。不过还好,geekos自带有一个帮助文档,虽说是英文的,但也能大概看得明白。估计不久后,我的英文水平又会提高不少。(^_^)

这个实验在红旗成功运行,在虚拟机里rh9也正常运行。不过在红旗中没有编译用到的一个库,我将它打包放在csdn上的,文件名为i386-redhat-linux.tar.gz,解压放在/usr/lib就行了。rh9中则不用了。

Linux的bochs的安装包也放在csdn了。文件名为bochs-2.3-1.i586.rpm

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客