操作系统课程设计_操作系统课程设计完整

2020-02-28 其他范文 下载本文

操作系统课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“操作系统课程设计完整”。

课程实验报告

课程名称:

操作系统原理课程设计

专业班级: 学

号: 姓

名 指导教师: 报告日期:

计算机科学与技术学院

目录

1.实验目的............................................................................................................................4 2.实验环境..........................................................................................................................4 3.实验内容..........................................................................................................................4 3.1 实验一....................................................................................................................4 3.2 实验二....................................................................................................................4 3.3 实验三....................................................................................................................5 3.4 实验四....................................................................................................................5 4.实验设计..........................................................................................................................5 4.1 实验一....................................................................................................................5 4.1.1 文件拷贝......................................................................................................5 4.1.2 并发进程分窗口显示....................................................................................5 4.2 实验二....................................................................................................................6.....................................................................................................................................6 4.3 实验三....................................................................................................................6 4.4 实验四....................................................................................................................7 5.实验步骤..........................................................................................................................8 5.1 实验一.............................................................................................................8 5.1.1 文件拷贝......................................................................................................8 5.1.2 并发进程分窗口显示....................................................................................9 5.2 实验二..................................................................................................................14 5.3 实验三..................................................................................................................15 2 5.4 实验四..................................................................................................................17 6.调试记录........................................................................................................................19 7.心得体会........................................................................................................................21 8.程序清单........................................................................................................................22 8.1实验一...................................................................................................................22 8.1.1 文件拷贝....................................................................................................22 8.1.2并发进程窗口显示......................................................................................23 8.2实验二...................................................................................................................33 8.3实验三...................................................................................................................34 8.4实验四...................................................................................................................38

1.实验目的(1)掌握Linux操作系统的使用方法;(2)了解Linux系统内核代码结构;(3)掌握实例操作系统的实现方法。

2.实验环境

本次课程设计采用的操作系统环境是Windows7、Ubuntu双系统,Ubuntu系统版本为15.04,内核版本是Linux 3.19。

3.实验内容

3.1 实验一

1)编写一个C程序,用fread、fwrite等库函数实现文件拷贝功能。

2)编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK),分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。

3.2 实验二采用编译内核的方法,添加一个新的系统调用实现文件拷贝功能 编写一个应用程序,测试新加的系统调用

3.3 实验三

采用模块方法,添加一个新的字符设备的驱动程序,实现打开/关闭、读/写等基本操作,编写一个应用程序,测试添加的驱动程序。

3.4 实验四

1)了解/proc文件的特点和使用方法。2)监控系统状态,显示系统部件的使用情况。

3)用图形界面监控系统状态,包括CPU和内存利用率、所有进程信息等(可自己补充、添加其他功能)。

4.实验设计

4.1 实验一

4.1.1 文件拷贝

实现文件拷贝功能需要使用的函数是fopen、fgetc、fputc,由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置循环,使用fgetc和fputc函数每次从源文件复制1个字节到目的文件,直到源文件指针到文件尾,实现文件拷贝操作。4.1.2 并发进程分窗口显示使用图形界面GTK实现窗口的显示,使用fork()创建三个并发进程: pid=fork():创建子进程。

返回值:0

从子进程返回 >0

从父进程返回

exit进程自我终止,进入僵死状态 wait()等待进程终止(由父进程调用)exec()执行一个可执行程序(文件)。

4.2 实验二

不同的Linux内核版本编译内核和添加系统调用的方法不尽相同,在网上查阅了资料之后找到适合3.19版本内核的编译方法。

所谓系统调用,即Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用,用户可以通过系统调用命令在自己的应用程序中调用它们。其调用机制为:使用寄存器中适当的值跳转到内核中事先定义好的代码中执行:跳转到系统调用的总入口system_call,检查系统调用号,再查找系统调用表sys_call_table,调用内核函数,最后返回。

实验二目的是更改内核中系统调用模块,增加自定义函数实现文件拷贝功能。

4.3 实验三

Linux设备驱动程序是一组常驻内存的具有特权的共享库,是低级硬件处理例程,每个设备文件有两个设备号,主设备号标识驱动程序,从设备号表示使用 6 同一个设备驱动程序的不同硬件设备。

设备驱动程序的功能包括:对设备初始化和释放,把数据从内核传送到硬件和从硬件读取数据,读取应用程序传给设备文件的数据和回送应用程序请求的数据,检测和处理设备出现的错误。

Linux支持的设备包括三种:字符设备、块设备和网络设备。添加设备驱动程序大致需要以下几个步骤:

1.注册设备 2.定义功能函数 3.卸载设备

4.4 实验四

proc文件系统特点:

1.进程文件系统和内核文件系统组成的复合体

2.将内核数据对象化为文件形式进行存取的一种内存文件系统

3.监控内核的一种用户接口,拥有一些特殊的纯文本文件,从中可以获取系统状态信息

4.系统信息:与进程无关,随系统配置的不同而不同 5.进程信息:系统中正在运行的每一个用户级进程的信息 其中各个文件保存的信息如下: /proc/cmd/line: 内核启动的命令行 /proc/cpuinfo: CPU信息

/proc/stat: CPU的使用情况、磁盘、页面、交换、所有的中断、最后一次的启动 7 时间等

/proc/meminfo: 内存状态的有关信息

利用/proc文件获取系统状态信息,并通过GTK图形化编程将系统信息以及通过这些信息计算得出的如CPU利用率、内存使用等通过窗口显示出来。

5.实验步骤

5.1 实验一

5.1.1 文件拷贝

文件拷贝主要是利用文件指针操作,在源文件和目的文件之间进行字符的复制,拷贝之前要判断源文件是否存在以及能否打开,这需要设置一个判断语句,同时也要设置判断语句判断目的文件是否存在,若不存在需要能够创建一个目的文件,最后执行循环拷贝。

步骤如下:

1.在Linux终端使用编译命令:gcc mycopy.c-o mycopy产生可执行文件。2.创建源文件wangzihao目的文件shaochongjun。3.编辑源文件:

4.打开可执行程序:./mycopy wangzihao shaochongjun 5.查看目的文件发现已经实现拷贝:

6.若源文件不存在会报错:

5.1.2 并发进程分窗口显示

1.使用fork()函数创建三个进程,使用exec函数族实现程序的调用:

2.调用创建窗口函数init_window(),将进程中的信息在窗口中显示:

3.分别创建三个程序实现显示系统时间、CPU利用率、累加求和功能:

4.运行结果如下:

5.2 实验二

原内核版本:3.19.0 编译新内核版本:3.19.8 1.下载内核并解压

2.系统调用函数实现:修改kernel/sys.c文件,在文件的最后添加新的系统调用函数:sys_mycall(char* sourceFile,char* destFile)3.设置系统调用号:修改arch/x86/syscalls/syscall_32.tbl,在最后一行添加新的系统调用号

4.添加系统调用声明到头文件 :~$ vi include/asm-generic/syscalls.h 在#endif前添

#ifndef sys_mycall asmlinkage long sys_mycall(long number);#endif

5.安装基本编译套件:apt-get install build-eential kernal-package libncurses5-dev fakeroot 6.配置内核:make menuconfig 7.编译内核:make-j4 8.安装内核:make modules_install make install 9.重启进入新的内核

10.编写测试程序测试新的系统调用:

测试结果如下:

5.3 实验三

1.编写Makefile文件:

2.编写设备功能函数:(见程序清单)

3.设备加载:make clean make

加载模块:insmod wzhdriver.ko

输入 cat /proc/devices得 设备驱动的主设备号为:

加载 设备,分配设备号:mknod /dev/wzhdriver c 248 0

更改操作权限:chmod 666 /dev/wzhdriver 4.运行测试程序,结果:

5.4 实验四

1系统信息页:

2进程信息页:

3内存资源页:

6.调试记录

1.在编译gtk程序时,需要添加` pkg-config --cflags--libs gtk+-3.0`.参数。2.实验一程序过于简单,健壮性不大。

3.由于一开始没有加入刷新函数,导致实验一显示窗口数据不变化,在同学帮助下改正。

4.编译内核占用大量时间后来发现在make后添加-j4可以大大提升速度。

7.心得体会

本次课程设计主要目的是熟悉Linux系统,掌握Linux操作系统的使用方法,了解Linux系统内核代码结构,掌握实例操作系统的实现方法。由于刚开始接触Linux,实验的开始遇到了不少困难,GTK的安装和使用花费了我不少时间,并行程序是操作系统课程学过的内容,主要难点是图形化界面的设计。

实验二是耗费时间最多的,由于每个版本的内核编译方式不同,耗费了大量时间查找编译内核的方法,同时编译一次内核需要一个小时以上,不过皇天不负有心人最后我成功添加了系统调用。

添加设备驱动比较简单,主要是了解了Linux设备驱动的原理,熟悉设备驱动的安装过程。

分析/proc文件主要是搭建图形化界面,在借鉴了网上资源设计的窗口之后,我设计了简单的监控系统图形界面,其中CPU利用率以及占用曲线等需要计算。通过本次实验我学到了很多东西,熟悉了Linux系统的使用方法,对Linux系统内核代码结构有了大致的了解,掌握了图形化界面GTK的使用,总而言之本次试验我获益匪浅。

8.程序清单

8.1实验一

8.1.1 文件拷贝 #include int main(int argc,char *argv[]){

if(argc!=3)

{ printf(“Error in argc!n”);return 0;

}

FILE * fsource=NULL;

FILE * ftarget=NULL;

if((fsource=fopen(argv[1],“rb”))==NULL)

{ printf(“Fail to open source file!n”);return 0;

}

if((ftarget=fopen(argv[2],“wb”))==NULL)

{ printf(“Fail to open target file!n”);22 return 0;

}

int c;

while((c=fgetc(fsource))!=EOF)

{ fputc(c,ftarget);

}

fclose(fsource);

fclose(ftarget);

return 0;} 8.1.2并发进程窗口显示

主函数:

#include #include #include int main(){ pid_t time;pid_t cpu;pid_t sum;23

if((time=fork())==-1){

}

if(time==0){ execlp(“./time”,0);printf(“fork errorn”);return-1;}else {

if((cpu=fork())==-1)//create cpu {

} if(cpu==0){ execlp(“./cpu”,0);printf(“fork errorn”);return-1;}else 24

{ if((sum=fork())==-1)//create sum

{

printf(“fork errorn”);

return-1;

}

if(sum==0)

{

execlp(“./sum”,0);

}else //father proce

{

wait(&time);

wait(&cpu);

wait(&sum);

}

}

}

} 系统时间:#include #include #include #include

char t[50];GtkWidget *label;gettime(){

time_t timep;

time(&timep);

sprintf(t,“%s”,ctime(&timep));} void *thread(void * argc){

while(1){

gettime();

gtk_label_set_text(GTK_LABEL(label),t);

sleep(1);}

}

int main(int argc, char *argv[]){

pthread_t id;

int i,ret;

ret=pthread_create(&id,NULL,(void *)thread,NULL);26

GtkWidget *vbox;

GtkWidget *window;

//定义一个组装盒;

/*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/

gtk_init(&argc, &argv);

/*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), “time”);

gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

label = gtk_label_new(t);

gtk_container_add(GTK_CONTAINER(window), label);

gtk_widget_show(label);

/*开始显示窗口*/

gtk_widget_show(window);

gtk_main();

return 0;} CPU利用率: #include #include

#include GtkWidget* label;//the use rate of cpu char c[5];float cpu();void* thread(void* arg){

} float cpu(){

FILE* fp;char buf[128];char cpu[5];long int user,nice,sys,idle,iowait,irq,softirq;float usage;while(1){

} sleep(2);usage=cpu();sprintf(c,“the usage of cpu is %f %%”,usage);gtk_label_set_text(GTK_LABEL(label), c);28

fp=fopen(“/proc/stat”,“r”);if(fp==NULL)printf(“errorn”);long int all1,all2,idle1,idle2;float usage;fgets(buf,sizeof(buf),fp);

canf(buf,“%s%ld%ld%ld%ld%ld%ld%ld”,cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);

canf(buf,“%s%ld%ld%ld%ld%ld%ld%ld”,cpu,&user,&nice,&sys,&idle,&iall1=user+nice+sys+idle+iowait+irq+softirq;idle1=idle;rewind(fp);//second sleep(1);memset(buf,0,sizeof(buf));cpu[0]='';user=nice=sys=idle=iowait=irq=softirq=0;fgets(buf,sizeof(buf),fp);29 owait,&irq,&softirq);

} int main(int argc, char *argv[]){

pthread_t id;

int i,ret;

ret=pthread_create(&id,NULL,(void *)thread,NULL);

GtkWidget *window;

/*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/

gtk_init(&argc, &argv);

/*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), “cpu”);

gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

label = gtk_label_new(c);usage=(float)(all2-all1-(idle2-idle1))/(all2-all1)*100;return usage;all2=user+nice+sys+idle+iowait+irq+softirq;idle2=idle;30

gtk_container_add(GTK_CONTAINER(window), label);

gtk_widget_show(label);

/*开始显示窗口*/

gtk_widget_show(window);

gtk_main();

return 0;} 求和:

#include #include #include #include

char s[1000];GtkWidget *label;

void *thread(void * argc){

int i,j,sum;

for(i=1,sum=0,j=1;i

sleep(3);

sum=sum+j;

j+=1;

sprintf(s,“%d”,sum);31

gtk_label_set_text(GTK_LABEL(label),s);

}

}

int main(int argc, char *argv[]){

pthread_t id;

int i,ret;

ret=pthread_create(&id,NULL,(void *)thread,NULL);

GtkWidget *vbox;

GtkWidget *window;

/*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/

gtk_init(&argc, &argv);

/*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), “sum”);

gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

label = gtk_label_new(s);

gtk_container_add(GTK_CONTAINER(window), label);

//定义一个组装盒;32

gtk_widget_show(label);

/*开始显示窗口*/

gtk_widget_show(window);

gtk_main();

return 0;} 8.2实验二

系统调用函数:

asmlinkage int sys_mycall(char* sourceFile,char* destFile){

int source=sys_open(sourceFile,O_RDONLY,0);

int dest=sys_open(destFile,O_WRONLY|O_CREAT|O_TRUNC,0600);

char buf[4096];

mm_segment_t fs;

fs = get_fs();

set_fs(get_ds());

int i;

if(source>0 && dest>0)

{

do{

i=sys_read(source,buf,4096);

sys_write(dest,buf,i);

}while(i);33

}

else {

printk(“Error!”);

}

sys_close(source);

sys_close(dest);

set_fs(fs);

return 10;} 测试程序: #include #include #include

int main(int argc,char **argv){ int i=syscall(359,argv[1],argv[2]);printf(“the %d”,i);return 1;} 8.3实验三

设备驱动:

#include #include #include 34 #include MODULE_LICENSE(“GEL”);MODULE_AUTHOR(“wangzihao”);#define DEV_NAME “wzhdriver” static ize_t GlobalRead(struct file *,char *,size_t,loff_t*);static ize_t GlobalWrite(struct file *,const char *,size_t,loff_t*);static int char_major = 0;static int GlobalData = 123456;struct file_operations globalchar_fops = {

.read = GlobalRead,.write = GlobalWrite };

static int __init GlobalChar_init(void){

int ret;

ret = register_chrdev(char_major,DEV_NAME,&globalchar_fops);

if(ret

{

printk(KERN_ALERT “GlobalChar Reg Fail!n”);

} 35

else

{

printk(KERN_ALERT “GloblaChar Reg Succe!n”);

char_major = ret;

printk(KERN_ALERT “Major = %dn”,char_major);

}

return 0;} static void __exit GlobalChar_exit(void){

unregister_chrdev(char_major,DEV_NAME);

printk(KERN_ALERT “GlobalCharDev is dead now!n”);

return;} static ize_t GlobalRead(struct file *filp,char *buf,size_t len,loff_t *off){

//GlobalData-= 1;

if(copy_to_user(buf,&GlobalData,sizeof(int)))

{

return-EFAULT;

}

return sizeof(int);36 } static ize_t GlobalWrite(struct file *filp,const char *buf,size_t len,loff_t *off){

if(copy_from_user(&GlobalData,buf,sizeof(int)))

{

return-EFAULT;

}

return sizeof(int);} module_init(GlobalChar_init);module_exit(GlobalChar_exit)测试程序:

#include #include #include #include #define DEV_NAME “/dev/wzhdriver” int main(){ int fd,num = 9999;

fd = open(DEV_NAME,O_RDWR,S_IRUSR | S_IWUSR);37 if(fd

{

printf(“Open Device Failed!n”);

return-1;} read(fd,&num,sizeof(int));printf(“The wzhdriver is %dn”,num);printf(“input a number written to wzhdriver: ”);scanf(“%d”,&num);write(fd,&num,sizeof(int));read(fd,&num,sizeof(int));printf(“The char you input is %dn”,num);

close(fd);return 0;} 8.4实验四

#include #include #include #include #include 38 #include #include #include #include #include #include

char *txt_pid=NULL;char *txt_pid2=NULL;

char* meminfo_read();/*内存使用情况*/ char* stat_read();/*cpu使用率*/ char* procsum_read();/*进程数*/

gint mem_refresh(gpointer mem_label);/*内存使用情况刷新*/ gint cpu_refresh(gpointer cpu_label);

/*cpu使用率刷新*/ gint proce_refresh(gpointer proce_label);/*进程数刷新*/

gboolean cpu_record_callback

(GtkWidget

*widget,GdkEventExpose *event,gpointer data);

gboolean mem_record_callback(GtkWidget *widget,GdkEventExpose *event,gpointer data);

void cpu_record_draw(GtkWidget *widget);void mem_record_draw(GtkWidget *widget);

static char temp_proce[50];/*进程数*/ static char temp_cpu[50];/*cpu使用率*/ static char temp_mem[50];/*内存使用*/ static long idle,total;static int flag=0;

/*计算cpu时的数据*/ /*计算cpu使用率时启动程序的标志*/

/*计算单个进程cpu使用率时使用的标志*/ static int flag1=0;

static long mem_total;static long mem_free;

/*内存总大小*/ /*空闲内存*/ static long long ustime[32768];/*前一次记录的用户态和核心态的总时间*/ static long mtime[32768];/*前一次记录的时刻*/ static float cpu_used_percent=0;

/*cpu使用率*/ static int cpu_start_position=15;/*绘制cpu移动的线条*/ static float cpu_data[66];static int flag2=0;

/*cpu历史数据*/

/*初始化cpu_data数组中数据的标志*/ static int cpu_first_data=0;/*第一个数据,既最早的数据,下一个要淘汰的数据 40 */ static float mem_data[66];/*cpu历史数据*/ static int flag3=0;

/*初始化cpu_data数组中数据的标志*/ static int mem_first_data=0;/*第一个数据,既最早的数据,下一个要淘汰的数据*/ static int mem_start_position=15;/*绘制内存移动的线条*/

static GtkWidget *cpu_record_drawing_area;

static GtkWidget *mem_record_drawing_area;

static GtkWidget *notebook;/////////////////////////////////////////////

void kill_proc(void){

char buf[20];sprintf(buf,“kill-9 %s”,txt_pid);

/*笔记本*/

system(buf);}

gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer

data){

gtk_main_quit();

return FALSE;}

char *get_cpu_name(char *_buf1){

FILE * fp;int i=0;char *buf1=_buf1;

fp=fopen(“/proc/cpuinfo”,“r”);for(i=0;i

char *get_cpu_type(char *_buf2){

FILE * fp;int i=0;char *buf2=_buf2;

fp=fopen(“/proc/cpuinfo”,“r”);for(i=0;i

char *get_cpu_f(char *_buf3){

FILE * fp;int i=0;char *buf3=_buf3;

fp=fopen(“/proc/cpuinfo”,“r”);for(i=0;i

char *get_cache_size(char *_buf4){

FILE * fp;int i=0;char *buf4=_buf4;

fp=fopen(“/proc/cpuinfo”,“r”);for(i=0;i

} fclose(fp);return buf4;char *get_system_type(char *_buf1){ FILE * fp;

int i=0;

//fp=fopen(“/proc/version”,“r”);

fp=fopen(“/etc/iue”,“r”);

fgets(buf1,256,fp);

for(i=0;i

buf1[i]='';

fclose(fp);

return buf1;}

char *get_system_version(char *_buf2)46 { FILE * fp;

int i=0;

int j=0;

fp=fopen(“/proc/version”,“r”);

fgets(buf2,256,fp);

for(i=0,j=0;i

buf2+=i;

for(i=0;i

buf2[i+1]='';

fclose(fp);

return buf2;}

char *get_gcc_version(char *_buf3){ 47 FILE * fp;

int i=0;

int j=0;

fp=fopen(“/proc/version”,“r”);

fgets(buf3,256,fp);

for(i=0,j=0;i

buf3+=i;

for(i=0;i

buf3[i+1]='';

fclose(fp);

return buf3;}

void get_proc_info(GtkWidget *clist,int *p,int *q,int *r,int *s){

DIR *dir;48

struct dirent *ptr;

int i,j;

FILE *fp;

char buf[1024];

char _buffer[1024];

char *buffer=_buffer;

char *buffer2;

char proc_pid[1024];

char proc_name[1024];

char proc_stat[1024];

char proc_pri[1024];

char proc_takeup[1024];

char text[5][1024];

gchar *txt[5];

gtk_clist_set_column_title(GTK_CLIST(clist),0,“PID”);

gtk_clist_set_column_title(GTK_CLIST(clist),1,“名称”);

gtk_clist_set_column_title(GTK_CLIST(clist),2,“状态”);gtk_clist_set_column_title(GTK_CLIST(clist),3,“优先级”);gtk_clist_set_column_title(GTK_CLIST(clist),4,“占用内存”);

gtk_clist_set_column_width(GTK_CLIST(clist),0,50);

gtk_clist_set_column_width(GTK_CLIST(clist),1,100);49

《操作系统课程设计.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
操作系统课程设计
点击下载文档
相关专题 操作系统课程设计完整 课程设计 操作系统 操作系统课程设计完整 课程设计 操作系统
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文