课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院课程设计任务书一.课设目的1.掌握Linux操作系统的使用方法;2.了解Linux系统核代码结构;3.掌握实例操作系统的实现方法。
二.课设容1.掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
(一)编一个C程序,其容为实现文件拷贝的功能;(二)编一个C程序,其容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
gtk/qt2.掌握系统调用的实现过程,通过编译核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用(实现的功能为文件拷贝)。
3.掌握增加设备驱动程序的方法。
通过模块方法,增加一个新的设备驱动程序,其功能可以简单(实现字符设备的驱动)。
4.了解和掌握/proc文件系统的特点和使用方法(选做)(一)了解/proc文件的特点和使用方法(二)监控系统状态,显示系统中若干部件使用情况(三)用图形界面实现系统监控状态。
5.设计并实现一个模拟的文件系统(选做)多用户的多级目录的文件系统设计。
多用户、多级目录、login (用户登录)、系统初始化(建文件卷、提供登录模块)、文件的创建、文件的打开、文件的读、文件的写、文件关闭、删除文件、创建目录(建立子目录)、改变当前目录、列出文件目录、退出。
三.课设说明Linux系统版本:Fedora 5.0 6.0 …ubuntu 10.04 11.10核版本:linux-2.6.x四.考核要求1.必须独立完成课程设计容,不分小组,不能有相同的拷贝。
2.上机考试:学生根据老师提出的要求,演示所完成的系统;并回答老师的问题。
3.第三周五下午2:00全体到实验室做中期检查,只检查1、2题;第四周周五下午2:00:最后检查。
按学号次序逐个检查。
4.评分方法:完成1、2题,得60-65分;完成1、2、3题,得65-75分;完成1、2、3、4(5)题,得80--100分;报告:10分(倒扣分)上交:课程设计报告(打印/电子档),容包括调试记录和程序清单(附注释)。
第六周五前以班为单位交指导老师。
五.参考资料Linux的“man”帮助!《Linux核2.4版源代码分析大全》《Linux核源代码分析》《Linux编程白皮书》.google.课程容与过程一.掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
1)编一个C程序,其容为实现文件拷贝的功能。
①任务分析:在Linux下,如果要编译一个C语言源程序,要使用到gcc编译器。
gcc编译器中,-o选项表示我们要求输出的可执行文件名。
-c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件。
-g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息。
知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了。
文件拷贝的C程序主要用到如下几个函数:open:打开文件open()函数功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。
所需头文件:#include <sys/types.h>,#include <sys/stat.h>,#include <fcntl.h>函数原型:int open(const char *pathname,int flags,int perms)参数:pathname:被打开的文件名(可包括路径名如"dev/ttyS0")flags:文件打开方式,O_RDONLY:以只读方式打开文件O_WRONL Y:以只写方式打开文件O_RDWR:以读写方式打开文件O_CREAT:如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限返回值:成功:返回文件描述符失败:返回-1●close:关闭文件close()函数功能描述:用于关闭一个被打开的的文件所需头文件:#include <unistd.h>函数原型:int close(int fd)参数:fd文件描述符函数返回值:0成功,-1出错●read:读操作read()函数功能描述:从文件读取数据。
所需头文件:#include <unistd.h>函数原型:ssize_t read(int fd, void *buf, size_t count);参数:fd:将要读取数据的文件描述词。
buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。
count:表示调用一次read操作,应该读多少数量的字符。
返回值:返回所读取的字节数;0(读到EOF);-1(出错)。
●write:写操作write()函数功能描述:向文件写入数据。
所需头文件:#include <unistd.h>函数原型:ssize_t write(int fd, void *buf, size_t count);返回值:写入文件的字节数(成功);-1(出错)②实现文件拷贝的源程序如下所示:#include<stdio.h>#include<fcntl.h>int main(int argc,char *argv[]){int sfd,tfd,num;char *buf;if(argc!=3){printf("ERROR!COPY FROM TO\n");return -1;}if((sfd=open(argv[1],O_RDONL Y,0))==-1){printf("ERROR,OPEN FILE FAILED !\n");return -1;}if((tfd=open(argv[2],O_WRONL Y|O_CREAT|O_TRUNC,0666))==-1){printf("TARGET FILE OPEN FAIL !\n");return -1;}while(num=read(sfd,buf,1)>0)write(tfd,buf,num);close(sfd);close(tfd);exit(0);}③程序运行结果源程序通过gcc编译器编译后会生成可执行文件1,执行可执行文件1之前,/hukeled目录下的文件a容如图1所示,文件b容如图2所示。
图1 执行1前文件a中的容图2 执行1前文件b中的容执行1后,目录/hukeled下文件b中的容如图3所示,由图可知文件a的容正确无误的拷贝到了文件b中,故程序运行结果正确。
图3 执行1后文件b中的容同时,源程序还可以实现图片等字符流数据的拷贝。
2)编一个C程序,其容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
①任务分析:程序是指令的有序集合,是一个静态概念,其本身并没有任何运行的含义。
而进程是程序在处理机上的一次执行过程,是一个动态概念。
一个程序可能有许多进程,而每一个进程又可以有许多子进程。
为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的)以便识别。
为了充分的利用资源,系统还对进程区分了不同的状态,将进程分为新建、运行、阻塞、就绪和完成五个状态。
当一个进程调用了fork以后,系统会创建一个子进程。
这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样,就像父进程克隆(clone)自己一样。
当然创建两个一模一样的进程是没有意义的。
为了区分父进程和子进程,我们必须跟踪fork的返回值,当fork调用失败的时候(存不足或者是用户的最大进程数已到)fork 返回-1。
否则fork的返回值有重要的作用。
对于父进程fork返回子进程的ID,而对于fork子进程返回0。
我们可以根据这个返回值来区分父子进程。
Qt是一个跨平台的C++图形用户界面库,具有优良的跨平台特性:1)Qt支持下列操作系统: Microsoft Windows 95/98,Microsoft Windows NT,Linux,Solaris,SunOS,HP-UX,Digital UNIX (OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX 等等。
2)面向对象3)Qt 的良好封装机制使得Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
Qt 提供了一种称为signals/slots 的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。
4)丰富的API5)Qt 包括多达250 个以上的C++ 类,还提供基于模板的collections,serialization,file,I/O device,directory management,date/time 类。
甚至还包括正则表达式的处理功能。
6)支持2D/3D 图形渲染,支持OpenGL7)大量的开发文档8)XML 支持。
在编译qt程序时,需要用到与编译普通程序不同的命令。
比如程序名为hello,则编译过程为:用qt的工具qmake来生成工程文件:qmake -project;生成Makefile文件:qmake hello.pro;接下来就是make;运行程序./hello。
②程序源代码为:int main(int argc, char *argv[]){QApplication a(argc, argv);MainWindow w;w.show();pid_t p1,p2,p3;if ((p1=fork()) == 0){execv("/home/hukeled/1.2/2",NULL);}else if ((p2=fork())==0){execv("/home/hukeled/1.2/3",NULL);}return a.exec();}二、掌握系统调用的实现过程,通过编译核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用(实现的功能为文件拷贝)。
①任务分析:一般的,进程是不能访问核的。
它不能访问核所占存空间也不能调用核函数。
CPU硬件决定了这些(这就是为什么它被称作"保护模式")。
系统调用是这些规则的一个例外。
其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。
在Intel CPU中,这个由中断0x80实现。
硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统核。
进程可以跳转到的核位置叫做sysem_call。