GeekOS操作系统课程设计 project0
项目设计0
一、项目设计目的
熟悉GeekOS的项目编译、调试和运行环境,掌握GeekOS运行工作过程。
二、项目设计要求
1、搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理。
2、熟悉键盘操作函数,编程实现一个内核进程。该进程的功能是:接收键盘输入的字符并显示到屏幕上,当输入ctrl+d时,结束进程的运行。
三、项目0的实现主要由以下步骤完成:
1、在项目0的/src/geekos/main.c中完成,编写一个C语言函数,函数功能是:接收键盘输入的按键,并将键值在显示器显示出来,当输入ctrl+d就退出;
2、在项目0的/src/geekos/main.c中完成,在Main函数体内调用Start_Kernel_Thread函数,将步骤1编写的函数地址传递给参数startFunc,利用Setup_Kernel_Thread函数建立一个待运行的线程。
3、在Linux环境下编译系统得到GeekOS镜像文件。终端进入project0的build目录下make depend、make。
4、编写一个相应的bochs配置文件。进入
project0的 Build目录下输入gedit .bochsrc编写bochs配置文件。
5、在bochs中运行GeekOS系统显示结果。进入project0的 Build目录下输入bochs运行Bochs模拟器,执行GeekOS内核。
四、步骤
1、编写项目0的/src/geekos/main.c
(1)在main.c前加入以下代码
void project0(){
Print("To Exit hit Ctrl + d.\n");
Keycode keycode;
while(1)
{
if(Read_Key(&keycode))
{
if(!((keycode & KEY_SPECIAL_FLAG) || (keycode & KEY_RELEASE_FLAG)))// 不是特殊键或者弹起
{
int asciiCode = keycode & 0xff;//d
if((keycode & KEY_CTRL_FLAG)==KEY_CTRL_FLAG && asciiCode=='d')//ctrl+d
{
Print("\n---------BYE!---------\n");
Exit(1);
}else
{
Print("%c",(asciiCode=='\r') ? '\n' : asciiCode);
}
}
}
}
}
(2)在main.c中加入以下代码
struct Kernel_Thread *thread;
thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);
(3)注释
注释掉以下代码
//TODO("Start a kernel thread to echo pressed keys and print counts");
2、编译、运行
进入geekos-0.3.0/src/project0/build/目录,直接开始编译:
$ make depend
$ make
$ bochs
3、修改.bochsrc
bochs第一次启动会出现>>PANIC<< .bochsrc:4: vgaromimage directive malformed.错误,打开.bochsrc:
修改:
#第4行注释
#vgaromimage:/export/home/daveho/linux/bochs-2.0.2/share/bochs/VGABIOS-lgpl-latest
#第5、6行修改
// 修改前:
romimage:file=/export/home/daveho/linux/bochs-2.0.2/share/bochs/BIOS-bochs-latest, address=0xf0000
// 修改后:
romimage: file=$BXSHARE/BIOS-bochs-latest
#第16、18、22行注释
# floppy_command_delay: 500
# ips: 1000000
# newharddrivesupport: enabled=1
4、关闭bochs窗口
- (1)可直接关闭
- (2)在终端先ctrl+c回到bochs那个命令行再exit
5、bochs窗口黑屏
- 如果新弹出的bochs窗口黑屏,可能是进入了调试模式,在终端中输入c回车,就可以了。
6、运行结果
五、作业题
1、GeekOS系统内核是如何编译的?
- 答:需提前安装GNU gcc编译器,用来编译C语言程序代码,NASM汇编器用来编译汇编语言程序代码。编译GeekOS源代码通过build目录下的Makefile文件来编译,其中已经写好了编译规则,使用make命令编译。(make depend扫描目录,判断依赖关系)
2、GeekOS系统内核编译的结果是什么?
- 答:GeekOS内核编译后,在build目录下会生成一个软盘镜像文件fd.img。
3、如何设置运行GeekOS系统的计算机环境?
- 答:安装Bochs PC模拟器,用来模拟运行GeekOS系统。
4、如何运行GeekOS系统内核?
- 答:使用Bochs模拟器模拟来运行Geekos系统内核,需要编写配置文件.bochsrc配置相应信息后使用bochs命令启动Bochs模拟器运行GeekOS编译生成的镜像(fd.img)。
5、GeekOS系统是如何创建键盘管理进程?
- 答:Init_Keyboard()函数:初始化键盘输入,包括初始化键盘缓冲区队列,初始化键盘中断处理函数,最后开启键盘中断。
6、简述计算机系统的启动流程。
-
答:
-
(1)、在Bochs开始运行系统后,首先会自动检测启动设备。
-
(2)、设备检测无异常往下执行,因为软盘首扇区最后一个字在编译时是写入55AA数据,而Bochs被配置为从软盘启动,这样Bochs得以成功地检测到GeekOS的启动软盘.之后Bochs就会像一台真正的计算机一样。
-
(3)、导入软盘的首扇区数据到从内存地址0x7c00开始的一块内存区,之后跳转到这个地址,开始执行这段首扇区内的程序代码.首扇区内的代码是由位于/src/geekos目录中的fd_boot.asm编译生成的引导程序.这段汇编程序完成搜索并装载软盘中的GeekOS内核二进制文件的功能
-
(4)、在装载完毕后,装载程序执行段间跳转,转入程序Setup(/src/geekos目录中的setup.asm编译生成)继续执行.Setup程序完成装载临时GDT,IDT描述符,打开A20地址线,初始化PIC中断控制器,最后由实模式跳入保护模式.完成了实模式向保护模式的转换之后,Setup跳转到内核ENTRY_POINT入口点.至此,GeekOS的引导过程结束,内核初始化过程开始。
-
(5)、GeekOS的内核入口点ENTRY_POINT指向的是内核Main函数的函数入口,在编译时完成对ENTRY_POINT的初始化.Main函数在src/src/geekos/main.c中实现.Main函数通过调用内核各模块的初始化函数来完成系统内核的初始化。