"); //-->
没想到这么早就做课设了。操作系统的课设这么早就开始了,课还没过几节呢。
说来真有点烦,做实验是一个叫做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
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。