桂林电子科技大学综合设计说明书用纸
《操作系统》
课程设计说明书
题
学
专
姓
学
目:
GeekOS 操作系统的研究与实验
院: 计算机科学与工程学院
信息安全
业:
名:
号:
指导教师:
黄廷辉
2013 年 03 月 24 日
桂林电子科技大学综合设计说明书用纸
目 录
1 GEEKOS 简介...........................................................................................................................................................1
1.1 GEEKOS 系统源代码结构 .................................................. 1
2 课程设计环境............................................................................................................................................................2
3 项目 0 的设计实现....................................................................................................................................................3
3.1 项目设计目的 ...........................................................3
3.2 项目设计要求 .......................................................... 3
3.3 项目实现原理 .......................................................... 3
3.4 项目实现过程 .......................................................... 3
3.5 运行结果 .............................................................. 5
4 项目 1 的设计实现.....................................................................................................................................................6
4.1 项目设计目的 ...........................................................6
4.2 项目设计要求 .......................................................... 6
4.3 项目实现原理 ...........................................................6
4.4 项目实现过程 ...........................................................8
4.5 运行结果 .............................................................. 9
5 项目 2 的设计实现..................................................................................................................................................10
5.1 项目设计目的 ..........................................................10
5.2 项目设计目的 ..........................................................10
5.3 项目实现原理 ..........................................................11
5.4 项目实现过程 ..........................................................13
5.5 运行结果 ..............................................................23
6 遇到问题及解决方法..............................................................................................................................................23
7 课程设计总结..........................................................................................................................................................24
桂林电子科技大学综合设计说明书用纸
第 1 页
1 GeekOS 简介
GeekOS 是一个基于 X86 架构的 PC 上运行的微操作系统内核,由美国马理兰大学的教师
开发,主要用于操作系统课程设计,目的是使学生能够实际动手参与到一个操作系统的开发
工作中。出于教学目的,这个系统内核设计简单,却又兼备实用性,它可以运行在真正的
X86 PC 硬件平台。作为一个课程设计平台,GeekOS 由一个基本的操作系统内核作为基础,提
供了操作系统与硬件之间的所有必备接口,实现了系统引导,实模式到保护模式的转换,中断
调用及异常处理,基于段式的内存管理,FIFO 进程调度算法以及内核进程,基本的输入输出
(键盘作为输入设备,显示器作为输出设备),以及一个用于存放用户程序的只读文件系统
PFAT。
学生可以在 Linux 或 Unix 环境下对其进行功能扩充,且其针对进程、文件系统、存储
管理等操作系统核心内容分别设计了 7 个难度逐渐增加的项目供学生选择 。
1.1 GeekOS 系统源代码结构
GeekOS 操作系统源文件 geekos-0.3.0.zip 可以从 http://geekos.sourceforge.net 下
载。
图 1.1 GeekOS 系统主目录
在 doc 目录里的文件 hacking.pdf 和 index.htm 是 GeekOS 系统的参考文档。Scripts
目录下有 startProject 和 removeEmptyConflicts 两个脚本文件。GeekOS 系统的源文件在
src 目录下,分为 7 个项目:Project0 到 Project7。在 build 文件夹中,包含系统编译后
的可执行文件的文件、软盘镜像或是硬盘镜像、makefile 项目管理文件。在 include 文件
夹中有 GeekOS 和 libc 两个子目录,在 GeekOS 子目录中有 kthread.h、keyboard.h 等文件。
桂林电子科技大学综合设计说明书用纸
第 2 页
图 1.2 项目文件结构图
2 课程设计环境
1. 虚拟机软件:VMware Workstation 7.0。
2. 虚拟系统:linux 系统 CentOS 5.5。
3. NASM 汇编器。
4. GNU gcc 编译器。
5. GNU gdb 调试器。
6. Sourse Insight:程序编辑器和代码浏览器。
7. Bochs:GeekOS 运行于 Windows(或 Linux)下的 Bochs PC 模拟器,Bochs 是用 C++ 开
发的可移植的 IA-32 (x86) PC 模拟器,它包括对 Intel x86 CPU 、通用 I/O 设备和可定制
的 BIOS 的模拟,几乎可以运行在所有流行的平台上。在本次课设中使用的事 bochs 2.6。
图 2.1 课设环境
桂林电子科技大学综合设计说明书用纸
第 3 页
3 项目 0 的设计实现
3.1 项目设计目的
熟悉 GeekOS 的项目编译、调试和运行环境,掌握 GeekOS 运行工作过程。
3.2 项目设计要求
1.搭建 GeekOS 的编译和调试平台,掌握 GeekOS 的内核进程工作原理。
2.熟悉键盘操作函数,编程实现一个内核进程。该进程的功能是:接收键盘输入的字符并显
示到屏幕上,当输入 ctrl+d 时,结束进程的运行。
3.3 项目实现原理
项目 0 主要要求设计一个函数对键盘的中断进行响应。这主要通过使用 GeekOS 提供
的键盘响应函数 Wait_Kernel_Thread 进行键盘中断的响应和返回键值。该函数首先检查键盘
缓冲区是否有按键,如果有,就读取一个简码,如果此时键盘缓冲区没有键值,就将线程放
入键盘事件等待队列。于是可分为两步完成:
1.编写函数 EchoCount,函输功能是:接受键盘输入的按键,并将键值显示在显示器,
当输入 Ctrl+D 退出。
2.在 Main 函数体内调用 Start_Kernel_Thread 函数,将编写的函数地址传递给 startFunc,
建立一个内核进程。
3.4 项目实现过程
1.添加代码
(1)在 Main 函数中编写一个函数,函数功能是:接收键盘输入的按键,并将键值显示
到显示器的函数,当输入 Ctrl+D 就退出。
void project0()
{Print("To Exit hit Ctrl + d.\n");
Keycode keycode;
while(1)
{
if( Read_Key(&keycode) )
{//读取键盘按键状态
if(!(
(keycode
KEY_RELEASE_FLAG)) )
&
KEY_SPECIAL_FLAG)
||
(keycode
&
{ //只处理非特殊按键的按下事件
int asciiCode = keycode & 0xff; //低 8 位为 Ascii 码
if(
(keycode
&
KEY_CTRL_FLAG)==KEY_CTRL_FLAG
&&
asciiCode=='d')
{//按下 Ctrl 键
Print("\n---------BYE!--------\n");
Exit(1);
}else{
桂林电子科技大学综合设计说明书用纸
第 4 页
Print("%c",(asciiCode=='\r') ? '\n' : keycode);
}
}
}
}
}//放在 main 函数之前
(2) 在 Main 函数体内调用 Start_Kernel_Thread 函数,将步骤 1 编写的函数地址传递给
参数 startFunc,建立一个内核级进程。
void Main(struct Boot_Info* bootInfo)
{
}
//TODO("Start a kernel thread to echo pressed keys and print counts");
struct Kernel_Thread *thread;
thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);
2.编译 GeekOS 项目 project0
(1)shell>># cd /…/geekos-0.3.0/src/project0/build
(2)shell>># make depend
生成 depend.mak 文件。
图 3.1 make depend 执行过程
(3)shell>># make
成功之后在 build 目录下生成 fd.img 文件。
桂林电子科技大学综合设计说明书用纸
第 5 页
图 3.2 make 执行过程
3.配置启动 Bochs
(1)创建 bochs 配置文件
shell>># gedit bochsrc
(2)在编辑器中输入一下配置内容
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
romimage:file=$BXSHARE/BIOS-bochs-latest
megs: 8
boot: a
floppya:1_44=fd.img, status=inserted
log: ./bochs.out
(3)保存,直接退出 gedit
3.5 运行结果
(1)启动 bochs
shell>># bochs - bochsrc
(2)选择 begin simulation
(3)结果:
桂林电子科技大学综合设计说明书用纸
第 6 页
图 3.3 项目 0 运行结果
4 项目 1 的设计实现
4.1 项目设计目的
熟悉 ELF 文件格式,了解 GeekOS 系统如何将 ELF 格式的可执行程序装入到内存,建立内核进程并
运行的实现技术。
4.2 项目设计要求
1.修改/geekos/elf.c 文件:在函数 Parse_ELF_Executable( )中添加代码,分析 ELF 格式
的可执行文件(包括分析得出 ELF 文件头、程序头,获取可执行文件长度,代码段、数据段
等信息),并填充 Exe_Format 数据结构中的域值。
2.在 Linux 环境下编译系统得到 GeekOS 镜像文件。
3.编写一个相应的 bochs 配置文件。
4.在 bochs 中运行 GeekOS 系统显示结果。
4.3 项目实现原理
1.ELF 文件格式。
连接程序视图
ELF 头部
程序头部表(可选)
节区 1
…
执行程序视图
ELF 头部
程序头部表
段 1