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

#第56行修改
// 修改前:
romimage:file=/export/home/daveho/linux/bochs-2.0.2/share/bochs/BIOS-bochs-latest, address=0xf0000
// 修改后:
romimage: file=$BXSHARE/BIOS-bochs-latest 

#第161822行注释
# 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函数通过调用内核各模块的初始化函数来完成系统内核的初始化。

  • 12
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值