操作系统——OrangeS

操作系统——OrangeS

实验环境:

VMware + Ubuntu32位

实验步骤:

自学第10章内容,理清相关代码结构,以及OrangeS所支持的功能

• 要求

– 利用当前OrangeS所提供的系统调用和API,自行编写一个应用程序,并编译生成存储在文件系统
– 在Shell中调用该程序,可启动并执行进程
– 进程结束后返回Shell
– 提示
• 可先尝试把chapter10/e代码跑通,倒退理解文件目录与代码结构
• 在linux里编写并编译生成,放到OrangeS的文件系统中

1.首先我们先理清楚大致的代码结构

操作系统——OrangeS
Boot/:从软盘启动操作系统;
Command/:定义的应用程序,也就是在shell中可以工作的应用程序;
Fs/:文件系统;
Include/:头文件;
Kernel/:内核部分;
Lib/:定义的一些可以被调用的函数,其中包括
操作系统——OrangeS
Fork.c,vsprintf.c都是很重要的;
Mm/:进程处理模块;
其余模块就不详细说明了,包括了一些镜像与bochs的设置文件等。

2.首先跑通原始代码

1)Hztian_final/Command/makefile
操作系统——OrangeS
2)Hztian_final/makefile
操作系统——OrangeS
操作系统——OrangeS

进入bochs:
操作系统——OrangeS
此时按ctrl + f2会切换到shell中1:
Echo hiztnb,将打印echo之后的字符串:
操作系统——OrangeS

按ctrl + f3进入shell2中:
Pwd,将打印当前运行程序与路径。由于文件系统比较简单,所以只会打印一个pwd:
操作系统——OrangeS
到这里为止,书上第十章给出的代码我们已经成功实现,代码中实现的两个指令pwd和echo都是可以运行的。

3.shell实现分析

由于我们要对他的shell进行修改并扩展,所以我们需要先了解他的shell是如何运行的。
1)Fork
Fork的概念在上学期的操作系统课程中就有接触,我记得还让我们编写了父子进程调用的代码,就是使用的fork函数。但在这里我们的任务则是实现一个fork函数,这就涉及到进程的切换了。在之前的章节中,我们的进程都是我们手动加的,每次要加进程的时候都需要直接来修改底层代码,这有点不符合常理…而shell就是一个很好的创建进程的功能。

Shell的功能:根据用户输入,开启一个子进程来处理用户输入,并等待子进程返回结果。当子进程返回时,回到shell当中继续等待用户输入。

从功能上看,这与我们的父子进程是基本相同的。在了解了这些之后,我们来看fork的实现过程。
操作系统——OrangeS
还是挺简短的,这个函数只是将msg的type值设置成了FORK(宏定义的值),然后将msg和其他一些参数传递给了send_recv函数,这个函数将会创建子进程,并将创建的结果存放在msg.PID中,以作为fork函数的返回值。
Fork函数虽然就这么简短,但是要做的准备工作还是挺多的。子进程得到的是除了代码段是与父进程共享的意外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,既然为副本,也就是说,二者并不共享地址空间。,两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。由此可见,代码段、堆栈段都是需要进行处理之后,才能顺利的使用fork函数。在我们的代码中使用的是do_fork函数来实现的。
操作系统——OrangeS
复制进程表;
操作系统——OrangeS

共享代码段;

操作系统——OrangeS

复制堆栈段与数据段;
操作系统——OrangeS

如果出现文件的处理,父子进程的文件也应是共用的;
操作系统——OrangeS

产生子进程!

2)shabby_shell
这个名字刚看到的时候确实有点意思,叫这个名字,他的原理看起来也不是很复杂。
操作系统——OrangeS
如果输入正确,则产生子进程,并将用户输入的字符串传递给子进程让他进行处理,父进程等待;
如果输入不正确,直接回显用户输入的指令,结束。
我们的代码对这个函数的调用如下:
操作系统——OrangeS
这是在init函数中的,也就是说在准备好父子进程调度之后,init创建两个子进程,分别为shell1,shell2。

4.shell功能拓展

在了解了shell的产生和工作过程之后,我们先来看看makefile中是怎么将进行编译链接的。
操作系统——OrangeS
我们运行的程序最初来源于command文件夹中编译后的文件。Command中的Makefile将该文件夹中的程序编译后打包为tar文件,再将打包后的tar文件整个装入磁盘。所以毋庸置疑,我们只需要在command/中来写自己的程序,并修改makefile就应该可以了。
操作系统——OrangeS
然后我们来修改makefile:
操作系统——OrangeS
修改部分由框图所示,我们来make一下。
操作系统——OrangeS
重新make image后,启动bochs:
操作系统——OrangeS

当只输入hizt指令时,它会提示你hizt指令之后应跟上其他内容;
操作系统——OrangeS

当hizt指令后跟上一个open指令,之后再加上一个文件名,将会输出正在打开文件的提示。由于我没有修改文件系统,所以此时仅仅是一个提示,还没有打开文件的功能。