欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

GeekOS||project0实现及问题解决

程序员文章站 2022-07-08 12:05:14
项目0的要求和意义Geekos是一个基于X86架构的PC上运行的微操作系统内核,主要用于操作系统课程设计,目的是使我们能够实际参与到一个操作系统的开发工作中。项目0要求实现一个内核进程,功能是实现从键盘接收一个按键,并在屏幕上显示。主要是让我们熟悉GeekOS的编译、运行过程,了解计算机系统的启动原理。实现过程1 . 准备:环境搭建1)在虚拟机下安装Ubuntu版本的Linux操作系统2)在…/project0/build目录下生成系统镜像文件make dependmake3)在该目录下...

项目0的要求和意义

Geekos是一个基于X86架构的PC上运行的微操作系统内核,主要用于操作系统课程设计,目的是使我们能够实际参与到一个操作系统的开发工作中。本文主要记录实现项目0的笔记。
项目0要求实现一个内核进程,功能是实现从键盘接收一个按键,并在屏幕上显示。主要是让我们熟悉GeekOS的编译、运行过程,了解计算机系统的启动原理。
Geekos下的各级目录(文件)一览:
GeekOS||project0实现及问题解决

实现过程

1 . 准备:环境搭建
1)在虚拟机下安装Ubuntu版本的Linux操作系统
2)在…/project0/build目录下生成系统镜像文件

make depend
make

3)在该目录下修改文件:bochsrc
vi bochsrc

//修改完后bochsrc文件内容如下
config_interface: textconfig
romimage: file=/usr/share/bochs/BIOS-bochs-latest
megs: 8
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=./fd.img, status=inserted
boot: a
ips: 1000000
log:./bochs.out
vga_update_interval: 300000
keyboard_serial_delay: 250
keyboard_paste_delay: 100000
private_colormap: enabled=0

4)在该目录下,执行GeekOS内核

bochs

运行后,屏幕上会有一些提示。运行GeekOS选择Begin simulation,如果GeekOS 编译成功,并且bochs的配置也没问题,将会看到一个模拟VGA的文本窗口,Geekos就能运行程序输出相应信息。
GeekOS||project0实现及问题解决
至此GeekOS系统编译和仿真完成,可以开始一系列的项目。
5)需要搭建好环境的操作系统的可以在评论区留下邮箱哈

2 . 修改main.c文件
1)进入对应目录: …/project0/src/geekos找到main.c文件

cd geekos-0.3.0/src/project0/src/geekos
vi main.c

2)注释掉TODU语句
TODU语句的作用是打印后面的字符串(该字符串为对应错误提示内容)并进入死循环,即终止执行,而我们要继续执行则必须注释该语句。
GeekOS||project0实现及问题解决
3)编写函数,实现接收并且回显按键(该函数明显是写在Main函数外部的)
代码如下:

void project0(){
	Print("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;
				if((keycode & KEY_CTRL_FLAG)==KEY_CTRL_FLAG && asciiCode=='d') 	{//按下CTRL +D后退出
					Print("\n---------SEE YOU!--------\n");
					Exit(1);
				}
				else {//不是CTRL +D则输出字符				
				Print("%c",(asciiCode=='\r') ? '\n' :keycode);
			    }
		    }
	    }
    }
}

GeekOS||project0实现及问题解决
4)在Main函数中创建内核模式的线程
代码如下:

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

GeekOS||project0实现及问题解决

报错及解决

至此,进入测试环节。回到…/project0/build目录下进行测试。
启动bochs:

bochs -f bochsrc

运行发现报错了,如图
GeekOS||project0实现及问题解决
运行中止,提示未实现功能…
猜测是不是环境搭建问题,便尝试重新搭建环境。输入命令 “make depend”,发现报错了提示“/bin/sh: cannot create depend.mak: Permission denied”,如下图
GeekOS||project0实现及问题解决
此时才意识到报错原因是不能在对应目录下创建/修改文件。
解决办法:添加权限,让其变成可执行文件
考虑到后面的其他项目也可能涉及创建/修改文件,故我选择直接给project0目录的根目录添加权限,让目录geekos-0.3.0及其子目录(子文件)可以拥有所有权限。命令如下:

sudo chmod -R 777 geekos-0.3.0

用“ls”命令查看该文件下的目录,会发现均变成绿色,则添加权限成功,如图
GeekOS||project0实现及问题解决

测试

在…/build目录下输入如下命令

make depend
make
bochs -f bochsrc

GeekOS||project0实现及问题解决

本文地址:https://blog.csdn.net/qq_43543920/article/details/107369421