已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 实 验 报 告课程名称: 操作系统原理课程设计 专业班级: 学 号: 姓 名 指导教师: 报告日期: 计算机科学与技术学院目录1.实验目的22. 实验环境23. 实验内容23.1 实验一23.2 实验二23.3 实验三23.4 实验四24. 实验设计34.1 实验一34.1.1 文件拷贝34.1.2 并发进程分窗口显示34.2 实验二334.3 实验三34.4 实验四45. 实验步骤45.1 实验一45.1.1 文件拷贝45.1.2 并发进程分窗口显示55.2 实验二95.3 实验三95.4 实验四116. 调试记录147. 心得体会158. 程序清单168.1 实验一168.1.1 文件拷贝168.1.2 并发进程窗口显示168.2 实验二218.3 实验三228.4 实验四241.实验目的(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设备驱动程序是一组常驻内存的具有特权的共享库,是低级硬件处理例程,每个设备文件有两个设备号,主设备号标识驱动程序,从设备号表示使用同一个设备驱动程序的不同硬件设备。设备驱动程序的功能包括:对设备初始化和释放,把数据从内核传送到硬件和从硬件读取数据,读取应用程序传给设备文件的数据和回送应用程序请求的数据,检测和处理设备出现的错误 。Linux支持的设备包括三种:字符设备、块设备和网络设备。添加设备驱动程序大致需要以下几个步骤:1. 注册设备2. 定义功能函数3. 卸载设备4.4 实验四proc文件系统特点:1.进程文件系统和内核文件系统组成的复合体2.将内核数据对象化为文件形式进行存取的一种内存文件系统3.监控内核的一种用户接口,拥有一些特殊的纯文本文件,从中可以获取系统状态信息4.系统信息:与进程无关,随系统配置的不同而不同5.进程信息:系统中正在运行的每一个用户级进程的信息其中各个文件保存的信息如下:/proc/cmd/line: 内核启动的命令行/proc/cpuinfo: CPU信息/proc/stat: CPU的使用情况、磁盘、页面、交换、所有的中断、最后一次的启动时间等/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 shaochongjun5.查看目的文件发现已经实现拷贝:6.若源文件不存在会报错:5.1.2 并发进程分窗口显示1. 使用fork()函数创建三个进程,使用exec函数族实现程序的调用:2. 调用创建窗口函数init_window(),将进程中的信息在窗口中显示:3. 分别创建三个程序实现显示系统时间、CPU利用率、累加求和功能:4. 运行结果如下:5.2 实验二原内核版本:3.19.0编译新内核版本:3.19.81. 下载内核并解压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 asmlinkagelongsys_mycall(longnumber); #endif5. 安装基本编译套件:apt-get install build -essential kernal-package libncurses5-dev fakeroot6. 配置内核:make menuconfig7. 编译内核:make -j48. 安装内核:make modules_install make install9. 重启进入新的内核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/wzhdriver4.运行测试程序,结果: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(argv1,rb)=NULL ) printf(Fail to open source file!n);return 0; if( (ftarget=fopen(argv2,wb)=NULL ) printf(Fail to open target file!n);return 0; int c; while(c=fgetc(fsource)!=EOF) fputc(c,ftarget); fclose(fsource); fclose(ftarget); return 0; 8.1.2 并发进程窗口显示主函数:#include#include#includeint main()pid_t time;pid_t cpu;pid_t sum;if(time=fork()=-1)printf(fork errorn);return -1;if(time=0)execlp(./time,0);elseif(cpu=fork()=-1) /create cpuprintf(fork errorn);return -1;if(cpu=0)execlp(./cpu,0);elseif(sum=fork()=-1) /create sumprintf(fork errorn);return -1;if(sum=0)execlp(./sum,0);else /father processwait(&time);wait(&cpu);wait(&sum);系统时间:#include#include#include #includechar t50;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); 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#includeGtkWidget* label; /the use rate of cpuchar c5;float cpu();void* thread(void* arg)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);float cpu()FILE* fp;char buf128;char cpu5;long int user,nice,sys,idle,iowait,irq,softirq;long int all1,all2,idle1,idle2;float usage;fp=fopen(/proc/stat,r);if(fp=NULL)printf(errorn);fgets(buf,sizeof(buf),fp);sscanf(buf,%s%ld%ld%ld%ld%ld%ld%ld,cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);all1=user+nice+sys+idle+iowait+irq+softirq;idle1=idle;rewind(fp);/secondsleep(1);memset(buf,0,sizeof(buf);cpu0=0;user=nice=sys=idle=iowait=irq=softirq=0;fgets(buf,sizeof(buf),fp);sscanf(buf,%s%ld%ld%ld%ld%ld%ld%ld,cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq);all2=user+nice+sys+idle+iowait+irq+softirq;idle2=idle;usage=(float)(all2-all1-(idle2-idle1)/(all2-all1)*100;return usage;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); gtk_container_add (GTK_CONTAINER (window), label); gtk_widget_show (label); /*开始显示窗口*/ gtk_widget_show(window); gtk_main(); return 0;求和:#include#include#include #includechar s1000;GtkWidget *label;void *thread(void * argc) int i,j,sum; for(i=1,sum=0,j=1;i0 & dest0) do i=sys_read(source,buf,4096); sys_write(dest,buf,i); while(i); else printk(Error!); sys_close(source); sys_close(dest); set_fs(fs); return 10; 测试程序:#include#include#includeint main(int argc,char *argv)int i=syscall(359,argv1,argv2);printf(the %d,i);return 1;8.3 实验三设备驱动:#include #include #include #include MODULE_LICENSE(GEL);MODULE_AUTHOR(wangzihao);#define DEV_NAME wzhdriverstatic ssize_t GlobalRead(struct file *,char *,size_t,loff_t*);static ssize_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(ret0) printk(KERN_ALERT GlobalChar Reg Fail!n); else printk(KERN_ALERT GloblaChar Reg Success!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 ssize_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);static ssize_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/wzhdriverint main() int fd,num = 9999; fd = open(DEV_NAME,O_RDWR,S_IRUSR | S_IWUSR); if (fd 0) 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 #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 process_refresh(gpointer process_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_process50;/*进程数*/static char temp_cpu50;/*cpu使用率*/static char temp_mem50;/*内存使用*/static long idle,total;/*计算cpu时的数据*/static int flag=0;/*计算cpu使用率时启动程序的标志*/static int flag1=0;/*计算单个进程cpu使用率时使用的标志*/static long mem_total;/*内存总大小*/static long mem_free;/*空闲内存*/static long long ustime32768;/*前一次记录的用户态和核心态的总时间*/static long mtime32768;/*前一次记录的时刻*/static float cpu_used_percent=0;/*cpu使用率*/static int cpu_start_position=15;/*绘制cpu移动的线条*/static float cpu_data66;/*cpu历史数据*/static int flag2=0;/*初始化cpu_data数组中数据的标志*/static int cpu_first_data=0;/*第一个数据,既最早的数据,下一个要淘汰的数据*/static float mem_data66;/*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 buf20;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;i5;i+) fgets(buf1,256,fp);for(i=0;i256;i+) if(buf1i=:) break;i+=2;buf1+=i;buf131=0;fclose(fp); return buf1;char *get_cpu_type(char *_buf2)FILE * fp;int i=0;char *buf2=_buf2; fp=fopen(/proc/cpuinfo,r);for(i=0;i2;i+) fgets(buf2,256,fp);for(i=0;i256;i+) if(buf2i=:) break;i+=2;buf2+=i;buf212=0;fclose(fp); return buf2;char *get_cpu_f(char *_buf3)FILE * fp;int i=0;char *buf3=_buf3; fp=fopen(/proc/cpuinfo,r);for(i=0;i7;i+) fgets(buf3,256,fp);for(i=0;i256;i+) if(buf3i=:) break;i+=2;buf3+=i;buf38=0;fclose(fp); return buf3;char *get_cache_size(char *_buf4)FILE * fp;int i=0;cha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保绿色校园我们共同的责任作文12篇
- 桌上的老相册回忆里的故事(9篇)
- 电工知识考试题库及答案
- 生产计划与调度指令下达表单
- 装饰电工考试题库及答案
- 企业信息系统集成及升级策略表
- 供应链协同管理模板及操作指南
- 2025年旅游行业旅游数字化发展案例分析研究报告及未来发展趋势预测
- 医疗信息化系统建设及维护协议说明
- 企业人员培训课程计划安排及实施模板
- 毕节防洪石笼网施工方案
- 江西洪城水业环保有限公司面向社会公开招聘工勤岗工作人员【28人】笔试考试参考题库及答案解析
- 创业投资条款详细清单模板
- 国家消防局系列消防安全培训课件-宾馆饭店消防培训课件
- 供应链优化在航空行业的可行性研究及案例分析报告
- 七年级数学上学期中模拟卷(人教2024版)
- 2025年中级育婴员职业技能鉴定高分必过试题库1000题(含答案)
- 物理期中达标测试练习卷-2025-2026学年物理八年级上学期(沪科版2024)
- 2025年宿州市公安机关第二批公开招聘警务辅助人员240人考试参考试题及答案解析
- 儿童胃肠镜检查健康宣教
- 2025年战伤救护理论考试题库及答案
评论
0/150
提交评论