《华科操作系统实验.doc》由会员分享,可在线阅读,更多相关《华科操作系统实验.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如有侵权,请联系网站删除,仅供学习与交流华科操作系统实验【精品文档】第 11 页课 程 实 验 报 告课程名称: 操作系统课程设计 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院目录实验1: 进程并发实验 1.1 实验概述 通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。1.2 实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。命令形式:copy 2. 编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口
2、做1到1000的累加求和,刷新周期均为1秒)。1.3 实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。主要实现3个进程的同步,3个进程分别为:实时显示系统时间
3、、循环显示0-9、显示1-1000的累加和。以上程序的刷新时间设置为1秒钟。使用的是c+编程语言。为了实现3个进程。需要为这3个进程分别创建3个不同的类,这3个不用的类具有不同的成员函数,使用成员函数来实现进程的所代表的具体细节。为了实现进程的结果能实时更新,需要调用connect()函数,该函数的功能是每当其中的timer每次发生变化时,就回调用该类的成员函数,也就是进程的具体实现,从而实时显示进程的细节内容。而3个进程的实现是在Main中创建3个类,对应3个进程,调用类的一些函数实现进程并发。1.4 实验过程给出实验过程的详细描述,分步骤说明实验的具体操作过程任务1。1.首先需要有复制源文
4、件和复制目的文件,具体实现方式如图1-1所示。图 1-1 打开文件分别以只读和只写的方式将文件打开。2.创建缓冲区,大小为10个字节的数组。如图1-2所示。图 1-2 创建缓存区3.通过循环读写的方式实现文件的复制,如图1-3所示。图 1-3 文件复制4.关闭文件。5.其中的writebuf和readbuf是自己编写的一个读和写的函数,调用的是read和write函数。如图1-4所示。图 1-4 读写函数任务2。1.首先根据3个不同的进程创建3个不同的类。如图1-5,图1-6,图1-7所示。图 1-5 进程1图 1-6 进程2图 1-7 进程32.分别为这3个类编写其对应的成员函数,实现进行的
5、具体功能。具体实现如图1-8,图1-9,图1-10所示。图 1-8 进程显示时间图 1-9 进程循环显示0-9图 1-10 进程显示1-1000求和3.在一个入口函数中创建3个不同的子进程,在进程中分别创建对应的类,使用类的方法来实现进程的功能。具体实现如图1-11.图 1.11 入口函数4.分别为这3个进程设计器对应的显示菜单,其中部分变量可以通过设置参数的方式进行调控。并将进程输出结果与Forms中的UI绑定,在进程结果显示在界面中。1.5实验结果任务1.任务1的内容比较简单,主要使用C语言完成程序的编写,其对应的结果有两种情况,复制成功或者复制失败,从实验1的第一阶段的代码可以看出,失败
6、阶段主要是是因为复制源文件打开失败造成的。下面主要演示完成正确赋值的情况。如图1-12所示。图 1-12 运行结果图将infile与outfile进行对比如图1-13,图1-14所示。图 1-13 复制原文件infile图 1-14 任务1复制输出文件进过对比可以看出,程序运行的结果正确。任务2.任务2需要并发执行3个进程,3个进程分别显示系统当前的时间, 1-1000的求和以及循环显示0-9,刷新时间为1秒(1000ms),程序的运行结果如下图 1-15所示。图 1-15 任务2进程运行结果图1.6实验小结本次实验分为2个任务,第一个任务完成文件的赋值拷贝。只要是运用write函数和read
7、函数对文件进行读写操作。操作简单没有什么难度,通过写readbuf函数和writebuf函数使得读写函数使用起来更加的方便。运行结果达到了预期要求。第2个任务需要实现进程的并行以及运行结果的刷新显示,编写的语言是采用c+语言,需要为3个进程创建3个不同的类,在同一个函数入口中对3个并发进行进行操作,并显示其对应的结果。其中遇到的问题主要集中在两个方便。一是怎样将输出结果与显示窗口进行绑定,绑定时需要注意什么以及如何调整。需要去网上查阅资料对对应的参数进行调整,由于QT的环境搭建的很好,学起来还是很轻松的。将菜单对应的标签与输出结果绑定即可。第二个问题是怎样实现1秒钟刷新一次输出结果呢?查阅资料
8、发现可以使用connect(timer, SIGNAL(timeout(), this, SLOT(MainWindowtm();每当timer发生变化时就会调用SLOT中对应的函数,该函数就是对应的进程。每一秒调用一次从而实现刷新。通过上述方法成功实现了进程并行与输出结果的刷新。实验2: 添加系统功能调用 2.1 实验概述 通过添加系统功能调用,掌握添加系统功能调用的方法。2.2 实验内容采用编译内核的方法,添加一个新的系统调用,实现文件拷贝功能编写一个应用程序,测试新加的系统调用。2.2.1 阶段1 添加源代码1.任务描述:添加的系统功能调用需要实现一个文件拷贝的系统功能。2.实验设计:本
9、次实验需要添加的系统功能调用时文件的复制拷贝功能,由于实验1的任务1已经使用c语言实现了该功能则可以借用实验1任务1的思想,只是需要将函数做一些修改,包括函数名格式,入口参数,以及其中调用的其他函数。3.实验过程:将调用函数名修改为以sys_开头的函数,命名为sys_mysyscall。文件的打开函数以及输出结果函数也需要使用内核函数,避免内存检查时出现错误。源代码如图2-1所示。图 2-1 编写系统调用源代码4.实验结果:完成系统功能调用源代码的设计。2.2.2 阶段2 连接新的系统功能调用1.任务描述:该阶段的任务主要是使得内核的其余部分知道该系统功能调用的存在。在该阶段需要编辑两个文件,
10、include/linux/syscalls.h以及arch/x86/syscalls/syscall_32.tbl。2.实验设计:该阶段需要修改include/linux/syscalls.h的代码添加新的系统调用的函数定义。asmlinkage long sys_mysyscall(int number);接着需要修改arch/x86/syscalls/syscall_32.tbl(系统调用表)在系统调用表中为新增的系统调用分配调用号和系统调用名。3.实验过程:在系统调用定义中添加新的系统条用定义。操作如图2-2所示。图 2-2 添加系统调用定义接着需要在系统调用表中为该系统调用分配一个系
11、统调用名和一个系统调用号。系统调用号为359,系统调用名为mysyscall如图2-3所示。图2-3 分配系统调用号和调用名4.实验结果:完成第二阶段添加系统定义以及为系统调用分配系统调用名和系统调用号。2.2.3 阶段3 重建内核1.任务描述: 在第三阶段主要完成系统内核的重建。2.实验设计:,其完成的步骤为:1.生成内核配置文件,2.编译内核映像,3.生成并安装模块,4.安装新的系统。其中如果报错说没有对应的软件包则需要下载软件包。3.实验过程:a.首先根据自己的内核版本下载对应的内核源码,生成内核配置文件,接着编译内核映像,实现的操作为:make menuconfig。运行成功回出现一个
12、弹出框,可以直接退出,如图2-4所示。图 2-4 生成内核配置文件1退出后显示如下结果如图 2-5 所示。图 2-5 生成内核配置文件2b.当完成内核文件的配置下面需要完成内核配置映像。操作为指令为make bzImage。如图2-6所示。图 2-6 编译内核映像由于在撰写实验报告时已经完成了编译,编译结果如图2-7所示。图 2-7 编译内核映像结果c.接下来需要编译内核模块。操作指令如图2-8所示。图 2-8 编译内核模块编译结果如图2-9所示。图 2-9 编译内核模块结果d.生成并安装模块。操作指令为:make modules_install,如图2-10所示。图 2-10 生成并安装内核
13、模块d.安装新的系统。操作指令如图2-11所示。图 2-12 安装新的系统安装结果如图2-12所示。图 2-13 安装新的系统2.2.4 阶段4 修改grub文件将/etc/default目录下的grub文件注释掉 GRUB_HIDDEN_TIMEOUT=0,然后运行update-grub命令。如图2-14所示。图 2-14 注释掉GRUB_HIDDEN_TIMEOUT=02.2.5 重启 选择新的修改内核 选择新的修改内核如图 2-15所示。图 2-15 选择新的修改内核2.2.6 编写程序测试编写的检测程序通过系统调用的返回值判断是否赋值成功,如图2-16所示。图 2-17 测试程序4.实
14、验结果 测试结果如图2-18,图2-19所示。图 2-18 系统调用测试图 2-19 系统调用测试结果2.3 实验小结对本次实验使用的理论、技术、方法和结果进行总结。描述一下通过实验你有哪些收获。本次实验的工程量还是相当大的,其中需要是实验步骤很繁多,并且必须一步一步全部正确,不然后面的步骤无法完成。实验课程的PPT教学做的还是很完善的,只要根据要求来,每步做正确,还是很容易的。实验完成了系统功能调用的添加。从最开始的编写系统调用源代码的编写到最后的系统功能调用的测试还是遇到了很多的问题。其中的内核版本的下载一定要和自己的版本很好的兼容,不然可能或多或少出现一些不必要的麻烦。添加的系统功能调用
15、的源代码一定要使用内核提供的函数进行编写,因为用户态的内存访问受到限制,可能会引起内存检测时出现错误。在编译内核模块和安装内核模块时需要很长的时间,需要确保在这段时间里电脑能正常的运行。不然要浪费掉很长的时间做一些重复的事情。在修改/etc/default/grub文件时可能不能直接修改,需要进行一些特殊的操作,类似获得权限。本次实验的收获良多,了解并实践了添加系统功能调用的整个过程,知道了系统功能调用的编写添加的机制,学会了怎样去添加一个新的系统功能调用。实验3: 添加设备驱动程序 3.1 实验概述 通过添加设备驱动程序掌握添加设备驱动程序的方法。3.2 实验内容采用模块方法,添加一个新的字
16、符设备驱动程序,实现打开/关闭、读/写等基本操作编写一个应用程序,测试添加的驱动程序3.2.1 阶段1 编写设备驱动程序1.任务描述:阶段1的任务主要是编写设备驱动程序,模块的初始化、设备的功能、以及模块卸载等。2.实验设计:编写设备驱动程序涉及的内容主要有:1.完成函数关系绑定,2.模块的初始化、需要实现哪些功能、模块的卸载以及释放内存。3.实验过程:a.完成函数入口绑定。此处实验只选择实现了部分功能。如图3-1所示。图 3-1 入口点绑定b.实现模块的初始化以及模块的卸载如图3-2所示。图 3-2 模块初始化和卸载c.实现设备驱动程序的相关功能。如图3-3所示。图 3-4 实现驱动设备功能
17、4.实验结果:完成设备驱动程序的编写。3.2.2 阶段2 编译设备驱动模块1.任务描述:该阶段主要完成设备驱动模块的编译。 2.实验设计:通过修改通用的Makefile文件完成编译操作。3.实验过程:修改课程提供的Makefile文件,在其中添加生成的模块名mydev.o。如图3-5所示。图 3-5 修改Makefile文件这个运行Makefile文件。操作指令:make.4.实验结果:完成设备驱动模块的编译。如图3-6所示。图 3-6 设备驱动模块的编译3.2.3 阶段3 加载设备驱动模块1.任务描述:该阶段主要完成设备驱动模块的加载。 2.实验设计:使用设备驱动模块的加载指令,完成加载。3
18、.实验过程:设备驱动模块的加载指令为:insmod mydev.ko。如图3-7所示。图 3-7 加载设备驱动模块4.实验结果:设备驱动模块加载成功。可以通过在文件/proc/devices中能看到新增加的设备,包括设备名mydev和主设备号。如图3-8,图3-9所示。图 3-8 模块加载成功图 3-9 模块加载成功3.2.4 阶段4 生成设备文件1.任务描述:该阶段主要完成生成对应的设备文件。2.实验设计:使用生成设备文件指令使其生成对应的设备文件名,设备文件名设置为test.3.实验过程:使用设备文件指令为:insmod mydev.ko。如图3-10所示。图 3-10 生成设备文件4.实
19、验结果:如果生成设备文件成功,可以看见在dev目录下有一个mydev2文件,如图3-11所示。图 3-11 参看设备文件3.2.4 阶段5 编写应用程序测试1.任务描述:编写应用程序测试。2.实验设计:编写应用程序测试,将其视为文件进行操作。3.实验过程:编写应用程序,代码如图3-12所示图 3-12 生成设备文件4.实验结果:测试结果正确,如图3-13所示。图 3-13 测试结果3.3实验小结本次实验主要完成添加设备驱动程序,熟悉添加设备驱动程序的过程,主要过程有便携设备驱动程序、编译、加载、生成设备文件、测试等过程。在这期间也遇到很多问题,其中主要集中在编写设备驱动程序中,在网上查阅相关资
20、料对编写设备驱动程序有很大的帮助。在实验中还遇到一个问题就是设备文件的权限问题,在使用设备文件之前需要修改设备驱动文件的权限,这样才能在测试时不会出现错误,还有在编写测试文件的时候需要主要,在Linux中将这个设备都视为文件的形式,运行就如同打开文件一般,同时需要加上对应的访问权限实验总结本次操作系统课程设计实验涉及的内容虽然不是很多,但是其涵盖的知识面还是很广的,主要涉及到怎样在Linux下编写C程序,怎样实现多进程并发执行,并学会使用Linux下的UI设计软件,添加系统功能调用以及添加设备驱动程序等。在Linux下编写C语言程序向对比较简单,在多进程并发执行中有很多需要注意的地方,首先是怎
21、样和自己使用的设计软件相结合,还有就是怎样实现显示刷新操作。这些功能实现都需要在网上查阅资料,做实验的同时锻炼了自己的学习能力。在添加系统功能调用的时候根据老师给的教学PPT来做实验显得很轻松,但是需要对其原理有很好的了解必须运用到课堂所学的知识,系统调用的原理,需要注意哪些问题,这些都可以帮助我们能加适应实验。通过系统功能调用实验我对操作系统的功能实现有了更加深刻的了解。在添加设备驱动程序的时候也很容易遇到一些问题,最难的我觉得就是编写设备驱动程序,需要理解设备驱动程序的作用和函数的功能,还有就是需要注意绑定函数的入口,同时要留意自己的主设备号,这样在生成设备文件的时候才能正确对应,测试文件很好的体现了Linux将“一切”视为文件的特点。本次操作系统的实验我学到了很多,也收货了很多,提升了自我。