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

2009-7-28 22:20 6294 3 5 分类: 工程师职场

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


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


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


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


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


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


点击开大图这样安装的缺省安装,环境变量已设置好了,不用我们管了。要看是不是成功安装了,在任意目录下输入: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 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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.


#这里是vgaromrom的所在之处,就是VGABIOS-lgpl-latestBIOS-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


geekos的project0原始源代码:https://static.assets-stash.eet-china.com/album/old-resources/2009/4/2/8be675c2-fbac-462a-9d6c-5433367ffa21.rar


 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户145921 2009-4-3 14:29

小弟也是开始学,不过这个系统的确很难懂--对于目前我的水平来说。 正在学它的源代码,难看懂!

tengjingshu_112148725 2009-4-2 22:36

总结很好
相关推荐阅读
用户145921 2011-10-08 17:34
关于停止更新本博客的声明
本博客是本人在大学学习单片机、嵌入式的记录。如今已经停止更新,任何问题均不再回复。本人现在主要维护两个博客:CSDN博客(木草山人和水田居士的小窝):http://blog.csdn.net/subf...
用户145921 2010-01-15 21:07
又是下雨天--记考研之后
今天下小雨,如果此刻到漓江边观景,应该别有一番风情。要是以前的我,一定会去的,然而,物是人非,现在的我早已不是当初的李迟了。今天是考研结束的第五天,考试前就想好要好好去疯狂一下,如今看来,不过是一句空...
用户145921 2009-11-01 22:04
桂X大大三学习生活总结
桂X大大三学习生活总结李迟按:本文在假期上辅导班时就开始着手写了,后来几经修改,删除了很多与时代潮流不符合的事实的描述,但还是保留了一些,我觉得,事实是任何事情抹杀不掉的,因为这是历史,我无法修改。记...
用户145921 2009-10-20 12:29
走进迟思堂之DTMF信号检测
声明:下面的文章不是李迟写的,是李迟的队友小郭写的,我一字没改,发表在此,是得到他同意的。因为我们两个是一个团队的,所以无所谓谁写的啦! 哇哈!成功喽!DTMF信号终于被我检测出来了,这可是一个了不起...
用户145921 2009-09-22 16:38
ATmega16与PC串口通信的实现
ATmega16与PC串口通信的实现1、这是我做的一个课设;2、功能很简单:在上位机输入数据,通过串口到达单片机,送至LCD1602显示,就这么简单;3、更详细不说,上图。上位机输入数据:显示:正在滚...
用户145921 2009-09-21 23:22
串口的printf实现
最近想搞一下SD卡,很久以前看过SD卡的规范以及相关的程序,后来由于种种原因,没有亲自去做,趁这几天没有上考研辅导课,就学习一下。但其中涉及到到串口的格式化数据传输问题,简单说就是相当于C语言中的pr...
EE直播间
更多
我要评论
2
3
关闭 站长推荐上一条 /3 下一条