GeekOS操作系统 Project0
一、构建基于Ubuntu9.04的实验环境
对于前期构建ubuntu9.04的实验环境可以参考教程:GeekOS: 一、构建基于Ubuntu9.04的实验环境
Ubuntu9.04(含用户名和密码)百度网盘链接:https://pan.baidu.com/s/1xopH6etKoOo11qyccDX36w
提取码:spck
在已经安装好VMware的基础上解压Ubuntu9.04压缩包之后双击下列红框
然后点击开启此虚拟机即可运行
因为该Ubuntu里已经含有geekos0.3.0安装包然后进入主文件夹,找到geekos压缩包,点击右键解压geekOS0.3.0文件,然后参考上诉链接的教程搭好环境后就可以开始实验了。
二、Project0的设计与实现
项目设计要求
- 搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理。
- 熟悉键盘操作函数,变成实现一个内核进程。该进程的功能是:接受键盘的输入字符并显示到屏幕上,当输入Ctrl+D时,结束进程的运行。
项目详细设计
因为项目要从键盘输入,所以需要一个键盘初始化函数Init_Keyboard,该函数存在于文件路径为/geekos0.3.0/src/project0/src/geekos的Keyboard.c文件中,其主要功能是设置初始状态下存放键盘扫描码的缓冲区,并为键盘中断设置处理函数。
void Init_Keyboard(void)
{
ushort_t irqMask;
Print("Initializing keyboard...\n");//初始化键盘
/* Start out with no shift keys enabled. */
s_shiftState = 0;
/* Buffer is initially empty. */
s_queueHead = s_queueTail = 0;//初始化缓冲队列为空
/* Install interrupt handler 为键盘中断安装一个处理程序*/
Install_IRQ(KB_IRQ, Keyboard_Interrupt_Handler);
// Keyboard_Interrupt_Handler(struct Interrupt_State* state)为一个键盘中断处理函数
/* Enable IRQ1 (keyboard) */
irqMask = Get_IRQ_Mask();//从16条中断线中获取当前中断线
irqMask &= ~(1 << KB_IRQ);
Set_IRQ_Mask(irqMask);
}
在/geekos0.3.0/src/project0/src/geekos路径的Keyboard.c文件中的Keyboard_Interrupt_Handler为一个键盘中断处理函数。键盘的中断处理过程是首先从相应的I/O端口读取键盘扫描码,根据是否按下shift键,分别在键值表中寻找扫描码对应的按键值,经过处理后将按键值放入缓冲区,最后通知系统重新调度进程。
static void Keyboard_Interrupt_Handler(struct Interrupt_State* state)
{
uchar_t status, scanCode;
unsigned flag = 0;
bool release = false, shift;
Keycode keycode