当前位置:文档之家› 操作系统课程设计

操作系统课程设计

《系统软件课程设计》实验报告专业计算机科学与技术组号姓名班级(组长)姓名班级姓名班级教师华东理工大学信息科学与工程学院2014年6 月20 日实验一Shell编程一. 课程设计内容和要求学习如何编写一个Linux的外壳——Shell,即命令解释程序。

学习怎样接受命令、解释命令、执行命令,特别是采用创建子进程的方式来执行一个程序,以及父进程如何继续子进程的工作。

二. 课程设计成员三. 软件系统设计int main(){char command[20],*argv[20];int argc,i;while(1){int argc=0;int outFile=-1;int inFile=-1;int Bkg=-1;int Ppipe=-1; //标志位复位char *path; //当前路径for(i=0;i<20;i++)command[i]=' ';path=get_current_dir_name();printf("[%s^v^]",path);get_string(command);argc=split(argv,argc,command);if(argc==0)continue;if(strcmp(argv[0],"exit")==0)break;if(outFile>0||inFile>0)ExecuteF1(argv,argc);else if(Ppipe>0)ExecuteP1(argv,argc);else if(strcmp(argv[0],"cd")==0)ExecuteCd(argv[1]);elseExecute(argv,argc);}void get_string(char command[]) //从键盘输入指令{...}int delet_space(int ptr,char usrComm[]) //删除空格{...}int get_a_word(char *argv1,int ptr,char com[]) //从指令中取出一个单词{...}int set_Background(char* argv[],int argc) //检测是否存在并发执行的符号“&”,并设置并发执行的标志(全局变量)。

{...}int split(char* argv[],int argc,char usrComm[]) //将命令拆分成一个个单词{...}int GetPath(char *paths[]) //将从PATH读出的绝对路径列表分割成一个一个的单独路径{...}char* ScanFile(char argv1[],char pathname[]) //在从PA TH分割出来的一组路径种,寻找argv1命令对应的文件,确定用户输入的命令文件的位置{...}void Execute(char *argv[],int argc) //执行没有特殊功能(即无重定向或管道)的用户命令{...}void setOutFile(char outFile[]) //设置输出重定向到文件{...}void setInFile(char inFile1[]) //设置输入重定向到文件{...}void ExecuteF1(char *argv[],int argc) //执行带输入或输出重定向功能的用户命令{…}void ExecuteP1(char *argv[],int argc) //执行带管道功能的用户命令{…}void ExecuteCd(char argv1[]) //执行cd命令,当有错误时显示错误信息{…}四. 上机实现情况及运行结果(包括中间和最终结果)编译一般指令及输出重定向运行结果输入重定向管道后台运行错误指令(健壮性)五. 小结1.课程设计中遇到的问题及解决办法。

因为很少在Linux下进行编程,所以刚开始做起来的时候感觉很吃力,最后通过参考一些网上的代码,并结合自己的理解终于搞懂了。

第一次运行的时候,只能执行一条指令,然后再输入一条指令的时候就崩溃了,刚开始不会调试,一直靠自己的理解一遍一遍看程序,可还是发现不了错误,最终还是逼着自己学会了Linux系统下的调试方法,发现原来是控制变量没有初始化的原因。

另一个问题是,我在自己编写的shell中执行命令时,一些系统命令如cat命令,echo 命令,grep命令等等都可以正常执行,但是一执行clear命令就会崩溃,我调试了好久一直没有发现错误在哪儿,最后想了下会不会是系统问题,然后就又安装了一个debian 系统,果然所有命令都能正常运行,看来Ubuntu还是有很多不足的地方,真想说一句“中看不中用啊”。

2.课程设计还存在哪些问题。

无3.对本课程设计有哪些建议。

我觉得这个课程设计对我们来说都是一门较新的知识,而且教程上写的也不是特别清楚,如果老师在前几天能够对每个实验做一个大概的讲解,这样我觉得大家会更容易上手。

4.本课程设计有哪些收获和心得体会。

通过本次的课程设计,我学会了如何编写一个shell来接受命令、解释命令和执行命令,以及如何采用创建子进程的方式来执行一个程序和让父进程继续子进程的工作。

我觉得最重要的是在这次的实验过程中,我学会了解决问题的方法,知道了遇到问题的时候该从何下手,提高了自己的自学能力。

刚开始拿到这个题目的时候,我真的是一头雾水,面对那么长的讲解真的不想看下去,但是想想最终必须得做完,所以,人嘛有时候还真得逼一下自己,当我花了一个下午的时间把实验要求看完后,我发现也不是那么的可怕,并且从中学习到了很多新的知识,并对一些旧的知识也有了更深层次的理解。

在开始写代码之前,我还在网上查了一些关于shell脚本的相关教学视频,我觉得那几天的观摩是非常有用的,在这个过程中我学会了一些Linux中常用的命令,并能够熟练操作,这对后面的实验过程带来了很大的便捷。

正式编码开始后,个人感觉自己的编码能力还是不甚如人意,便在网上找了一些相关的代码进行参考,并在不断地思考与改进中完成了最终版本,这让我成就感倍增啊!尤其是当我学会了在Linux中如何进行调试时,我相当的高兴。

这次实验让我知道了,有些东西不是生来就会的,大家都是慢慢学的,所以以后遇到新问题的时候不要怕,要勇敢地尝试,要循序渐进,基础打好是非常重要的。

还有,自学能力也是非常重要的,在接下来的日子里我会更加注重这方面的能力培养。

5. 其它需要补充的问题。

总共三个实验,每组三个人,一人一个,体现不出团队合作意识,为何要分组呢?六.教师评语实验二 Linux系统调用一. 课程设计内容和要求学习系统调用的执行流程,理解Linux系统调用,并且在内核中增加一个新的系统调用。

下载最新版本的Linux内核源代码,在Linux系统中解压缩,大致观察内核源代码的组成结构。

然后编译这个版本的内核代码,并尝试用编译出的内核重新引导系统。

添加一个新的系统调用,完成任意一个功能,重新编译和运行内核,使新的系统调用可用。

编写一个用户态的程序,使用增加的系统调用,以证明它确实可以用。

二. 课程设计成员三. 软件系统设计1.获取源代码首先要下载一个2.6.28版本的内核,用root 用户登录Linux,并把该文件放到/root 目录中,打开终端,输入命令tar –jxvf linux‐2.6.28.tar.bz2 –C /usr/src/kernels/。

该命令的作用是解压缩内核文件到/usr/src/kernels/目录下,输入命令cd /usr/src/kernels/linux‐2.6.28 该命令是进入/usr/src/kernels/ linux‐2.6.28 文件夹,自己的内核解压后的文件名代替2.配置编译环境输入命令vi kernel/sys.c 在文件最后加入我们要添加的系统调用的函数asmlinkage int sys_mycall(int number){If(number>0)return 7;elsereturn 13081007;}保存并退出输入命令vi arch/x86/kernel/syscall_table_32.S,在文件的最后加入一行.long sys_mycall,保存并退出,这是系统调用表项,当需要系统调用的时候,操作系统会来查看这个文件看看是否有系统调用的定义。

输入命令 vi arch/x86/include/asm/unistd_32.h,在#define __NR_XXX 332 下面加入一行#define __NR_mycall 333,保存并退出,这个是系统调用的入口,接下来测试系统调用需要用到系统调用入口。

3.编译内核首先回到内核目录中,输入命令cd /usr/src/kernels/linux‐2.6.28,输入命令make mrproper 该命令是内核编译的一些初始化工作,第一次编译一个版本的内核时使用;输入命令make menuconfig,该步是生成配置文件的命令,新版本内核都会加入一些新的功能;输入命令make clean;输入命令make bzImage这里就真正的开始编译内核了;编译成功后,输入命令make modules,这个是把刚才编译好的目标文件编译成Linux 的内核模块;输入命令make modules_install,这个命令是安装刚才编译的内核模块,安装完后,大家可以在/lib/modules/目录下看到我们最新编译的内核模块2.6.28。

输入命令cp /usr/src/kernels/linux‐2.6.28/arch/x86/boot/bzImage /boot/vmlinuz‐2.6.28,这个命令式复制我们刚才编译好的内核到/boot 目录下,并重命名为vmlinux‐2.6.28,/boot 目录是开机需要的一些文件和配置,vmlinux‐2.6.28 就是我们的内核文件了4.配置开机信息输入命令cd /boot进入/boot 目录输入命令mkinitrd initrd‐2.6.28.img 2.6.28这个命令是生成开机需要的文件最后,输入命令cd grub进入grub 目录,输入命令vi menu.lst在文本最后输入以下文字title 2.6.28root (hd0,0)kernel /boot/vmlinuz‐2.6.28 or root=LABEL=/ rhgb rhgbinitrd /boot/initrd‐2.6.28.img保存并退出5.重启并测试是否增加了调用重启,在开机时读秒的地方按一下方向键,可以看到多出了一个引导项2.6.28,点击进入,如果能顺利进入系统,就说明编译内核成功,否则,就是失败了,或者哪个环节有错误。

相关主题