GeekOS之旅-Project0 (Echo your Input until you press Ctrl-d )

开始GeekOS之旅了, What 's the next Step ? 不急,阅读下GeekOS自带的手册.

Introduction:

GeekOS is an educational operating system kernel.GeekOS tries to combine realism and simplicity. It is a realisticsystem because it targets a real hardware platform - the x86 PC.It strives for simplicitly in that it contains the bare minimum functionalitynecessary to provide the services of a modern operating system,such as virtual memory, a filesystem, and interprocess communication.

Overview of GeekOS

1.Memory

2.Interrupts and Threads

3.Devices

上面三个是重点,你需要去了解并深入. 因为下面的Project肯定会cover.

Project0

稍微了解了下GeekOS, 下面正式进入Project0

Project0会相对比较简单,因为它只是引导你入门GeekOS!

->目标 :首先你需要添加个内核线程来向屏幕上输出"Hello from XXX" (xxx is your name),接着读取键盘的输入并回车后回显到屏幕上,除非你使用C-d来结束它!就这么简单.

..来看下未解决之前的bochs的界面:


既然需要创建个内核模式的线程,就要读下它的关于线程的代码 src/geekos/kthread.c

大概浏览了下这个文件的代码,先不研究细节,直接找我们需要的函数, 我们需要一个创建的线程能够回调我们自定义的函数,根据这点,可以找到这么个函数

starut Kernel_Thread* Start_Kernel_Thread(Thread_Start_Func startFunc, ulong_t arg, int priority, bool detached);

上面是个函数原型,在这个函数上面有这个函数的参数解释:

startFunc:这是回调函数入口

arg:上面注解是 is pass to the new function,没看懂 先pass

priority:这个按照字面就可以理解成 线程优先级了. 大部分可以设置为 PRIORITY_NORMAL

detached:对于kernel threads 请传入false

依次看下来 也就第二个参数不解了,没事 我们找找看是否这个创建线程的函数是否被调用过, good, 在 448行被调用了

Start_Kernel_Thread(Repear, 0, PRIORITY_NORMAL, true);

既然它第二个参数传入0 ,那我们也传入0 !

我们先完成它这个任务的第一部分(输出Hello from Crazybaby),虽然很简单,但是Step by Step. 毕竟头脑堆栈有限. 呵呵!

关键代码如下:

25 void GoForIt(){ 26 Print("Hello from Crazybaby\n"); 27 }

52 Start_Kernel_Thread(GoForIt, 0, PRIORITY_NORMAL, false); 53 54 // TODO("Start a kernel thread to echo pressed keys and print counts");

虽然代码简单,这里有两点要注意:

1.GeekOS的打印需要用Print 因为它是个独立的OS 使用的是自身的lib!

2.第二段代码有个TODO, 虽然放在那是可以的, 因为我们是开启线程来打印的, 但是那么多字打印出来实在不雅 ,所以我们可以选择的把它注释掉. 第一次效果如下:


下面我们继续完成第二部分,读入输入的字符并回显 !

心想这还不easy, 谁知,自己滴滴嗒嗒写完 发现, 编译不支持 getchar 之类的函数

undefined reference to `getchar' make: *** [geekos/kernel.exe] Error 1

唉 刚才还说了自己都忘了. 那就还是寻找 GeekOS提供的函数吧 !

看了下geekos下面的源文件, 文件很少 所以可以很快定位到 keyboard.c

根据每个函数头部的解释可以在文件最下面找到 Wait_For_Key 这个函数.

看下原型:

Keycode Wait_For_Key(void)输入参数为 void , 不考虑

输出参数为 Keycode ,可以看一下Keycode的声明,用Vim定位了下KeyCode 没有在本文件中找到, 然后看下头文件发现是在 keyboard.h下. 找到

typdef ushort_t Keycode. 是个无符号short类型. 下面来看下程序简单流程图:

我们还需要 识别回车 和 C-d 这两个"信号"

剩下的就要靠下面这个大数组了:

首先判断C-d , (KEY_CTRL_FLAG | 0x64 ) == kecode

再判断 是否回车 13 == keyCode

还需要判断 键是否已经release 不然 你按下的时候已经上屏 松开又上屏一次!

下面是详细代码:

25 void GoForIt(){ 26 Print("Hello from Crazybaby\n"); 27 Keycode ret; 28 while (1) { 29 ret = Wait_For_Key(); 30 if (!(ret & KEY_RELEASE_FLAG)) { 31 if ((KEY_CTRL_FLAG | 0x64) == ret) { 32 Print("%s\n", "GeekOS's Project0 is over!");. 33 break; 34 } 35 if (13 != ret) { 36 Print("%c", ret); 37 } 38 else 39 { 40 Print("\n"); 41 } 42 } 43 } 44 }测试结果:


Ok ,继续第二个Project!


### 关于 GeekOS 课程设计 Project 1 的资源与指南 GeekOS 是一个用于教学目的的操作系统项目,通常被用来帮助学生理解操作系统的核心概念以及其实现细节。对于 **Project 1**,其目标通常是围绕操作系统的初始化、内存管理或者基本进程控制展开[^2]。 以下是关于如何查找和利用相关资料的一些建议: #### 资源获取途径 可以参考一些公开的教学材料或类似的开源项目文档来辅助学习。例如: - 官方课程网站或讲义:许多大学会提供详细的项目说明和技术指导文件,这些文件可能包含了实现的具体要求和建议的技术路线。 - 开源社区贡献者分享的经验博客或教程文章:通过搜索引擎输入关键词如 `geekos project 1 tutorial` 或 `operating systems course projects examples` 可能找到其他学生的经验总结[^3]。 #### 技术要点解析 根据常见的操作系统课程设计需求,以下是一些技术方面的提示: - **启动过程分析**:了解引导加载程序的工作原理及其在操作系统中的角色是非常重要的。这涉及到硬件抽象层的知识点[^4]。 - **内存分配策略**:如果项目涉及到了简单的内存管理系统构建,则需要掌握静态/动态分区分配算法的基础理论[^5]。 - **中断处理机制**:熟悉处理器是如何响应外部事件并切换上下文环境的过程有助于完成某些特定功能模块的设计开发工作[^6]。 ```c // 示例代码片段展示了一个简化版的函数原型定义, // 这里假设我们要创建一个新的线程执行指定的任务。 int create_thread(void (*start_routine)(void *), void *arg); ``` 上述伪代码展示了创建新线程的一个接口声明形式,在实际编码过程中还需要考虑同步原语的应用等问题[^7]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值