GeekOS-Project0

轉自 http://www.cnblogs.com/wuchang/archive/2009/06/02/geekos-project0.html

一、項目設計目的

熟悉GeekOS的項目編譯、調試和運行環境,掌握GeekOS運行工作過程。

二、項目設計要求

1、搭建GeekOS的編譯和調試平臺,掌握GeekOS的內核進程工作原理。

2、熟悉鍵盤操作函數,編程實現一個內核進程。該進程的功能是:接收鍵盤輸入的字符並顯示到屏幕上,當輸入ctrl+d時,結束進程的運行。

三、項目0的實現主要由以下步驟完成(在項目0的/src/geekos/main.c中完成):

1.編寫一個C語言函數,函數功能是:接收鍵盤輸入的按鍵,並將鍵值在顯示器顯示出來,當輸入ctrl+d就退出;

2.在Main函數體內調用Start_Kernel_Thread函數,將步驟1編寫的函數地址傳遞給參數startFunc,利用Setup_Kernel_Thread函數建立一個待運行的線程。

3.在Linux環境下編譯系統得到GeekOS鏡像文件。

4.編寫一個相應的bochs配置文件。

5.在bochs中運行GeekOS系統顯示結果。


上一篇博文中 已經介紹瞭如何搭建開發環境,現在來開始第一個實驗。

首先需要了解一下將要用到的二個函數:

Read_Key()、Start_Kernel_Thread();

Read_Key 是鍵盤相關的函數,在keyboard.h中定義,project0的main.c文件中已經包含有了此頭文件。

一、函數介紹

1.Read_Key()

定義:bool Read_Key(Keycode *keycode);

作用:輪查鍵盤事,如果捕獲到鍵盤事件,則返回true,並且將按鍵碼保存到參數 keycode地址中。

函數返回數據類型都是16位的Keycode類型,定義如下:

typedef ushort_t Keycode

在keyboard.h中還定義了一系列的鍵盤碼常量。

Keycode的高8位爲標誌位。
如果第8位爲0,則keycode的低8位爲按鍵的ASCII碼,
如果第8位爲1,表示按下的是F1-12系列或其ctrl/shift/alt等特殊鍵。
其它常用的幾個標誌位:
第12位:SHIFT_FLAG,爲1表示shift鍵處於按下狀態
第13位:ALT_FLAG,爲1表示alt鍵處於按下狀態
第14位:CTRL_FLAG,爲1表示Ctrl鍵處於按下狀態
第15位:RELEASE_FLAG,爲1是釋放事件,爲0是按下事件,就是 windows編程中常用的keyup和keydown。

2.Start_Kernel_Thread();
定義:
void Init_Scheduler(void);
struct Kernel_Thread* Start_Kernel_Thread(
    Thread_Start_Func startFunc,  //線程函數地址
    ulong_t arg, //線程函數參數
    int priority, //優先級
    bool detached  //線程屬性,false爲內核線程,true爲用戶線程
);

作用:創建並啓動一個線程
此函數返回的是Kernel_Thread結構體類型數據,在這裏我們不對此結構體作深入介紹。

二、編碼

在main.c中新加個函數,命名爲projecto,函數的代碼如下:

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; //低8位爲Ascii碼

if( (keycode & KEY_CTRL_FLAG)==KEY_CTRL_FLAG && asciiCode=='d') //按下Ctrl鍵
{
Print("/n---------BYE!--------/n");
Exit(1);
}else
{
Print("%c",(asciiCode=='/r') ? '/n' : asciiCode);
}
}
}
}
}

再修改Main函數,將TODO(“…..這一行替換爲以下代碼:

    struct Kernel_Thread *thread;
    thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);

保存代碼,按上一篇文章中的方法編譯,並在bochs中引導系統。
運行效果如下圖所示:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章