华科操作系统实验_第1页
华科操作系统实验_第2页
华科操作系统实验_第3页
华科操作系统实验_第4页
华科操作系统实验_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 实 验 报 告课程名称: 操作系统课程设计 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院目录实验1:进程并发实验11.1 实验概述11.2 实验内容11.3 实验设计11.4 实验过程21.5实验结果61.6实验小结7实验2:添加系统功能调用82.1 实验概述82.2 实验内容82.2.1 阶段1 添加源代码82.2.2 阶段2 连接新的系统功能调用92.2.3 阶段3 重建内核102.2.4 阶段4 修改grub文件132.3 实验小结14实验3:添加设备驱动程序153.1 实验概述153.2 实验内容153.2.1 阶段1 编写设备驱动程序153.2.2 阶段2 编译设备驱动模块163.2.3 阶段3 加载设备驱动模块173.2.4 阶段4 生成设备文件183.2.4 阶段5 编写应用程序测试183.3实验小结19实验总结2020实验1: 进程并发实验 1.1 实验概述 通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。1.2 实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。命令形式:copy 2. 编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。1.3 实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。主要实现3个进程的同步,3个进程分别为:实时显示系统时间、循环显示0-9、显示1-1000的累加和。以上程序的刷新时间设置为1秒钟。使用的是c+编程语言。为了实现3个进程。需要为这3个进程分别创建3个不同的类,这3个不用的类具有不同的成员函数,使用成员函数来实现进程的所代表的具体细节。为了实现进程的结果能实时更新,需要调用connect()函数,该函数的功能是每当其中的timer每次发生变化时,就回调用该类的成员函数,也就是进程的具体实现,从而实时显示进程的细节内容。而3个进程的实现是在Main中创建3个类,对应3个进程,调用类的一些函数实现进程并发。1.4 实验过程给出实验过程的详细描述,分步骤说明实验的具体操作过程任务1。1.首先需要有复制源文件和复制目的文件,具体实现方式如图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个类编写其对应的成员函数,实现进行的具体功能。具体实现如图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的第一阶段的代码可以看出,失败阶段主要是是因为复制源文件打开失败造成的。下面主要演示完成正确赋值的情况。如图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函数对文件进行读写操作。操作简单没有什么难度,通过写readbuf函数和writebuf函数使得读写函数使用起来更加的方便。运行结果达到了预期要求。第2个任务需要实现进程的并行以及运行结果的刷新显示,编写的语言是采用c+语言,需要为3个进程创建3个不同的类,在同一个函数入口中对3个并发进行进行操作,并显示其对应的结果。其中遇到的问题主要集中在两个方便。一是怎样将输出结果与显示窗口进行绑定,绑定时需要注意什么以及如何调整。需要去网上查阅资料对对应的参数进行调整,由于QT的环境搭建的很好,学起来还是很轻松的。将菜单对应的标签与输出结果绑定即可。第二个问题是怎样实现1秒钟刷新一次输出结果呢?查阅资料发现可以使用connect(timer, SIGNAL(timeout(), this, SLOT(MainWindowtm();每当timer发生变化时就会调用SLOT中对应的函数,该函数就是对应的进程。每一秒调用一次从而实现刷新。通过上述方法成功实现了进程并行与输出结果的刷新。实验2: 添加系统功能调用 2.1 实验概述 通过添加系统功能调用,掌握添加系统功能调用的方法。2.2 实验内容采用编译内核的方法,添加一个新的系统调用,实现文件拷贝功能编写一个应用程序,测试新加的系统调用。2.2.1 阶段1 添加源代码1.任务描述:添加的系统功能调用需要实现一个文件拷贝的系统功能。2.实验设计:本次实验需要添加的系统功能调用时文件的复制拷贝功能,由于实验1的任务1已经使用c语言实现了该功能则可以借用实验1任务1的思想,只是需要将函数做一些修改,包括函数名格式,入口参数,以及其中调用的其他函数。3.实验过程:将调用函数名修改为以sys_开头的函数,命名为sys_mysyscall。文件的打开函数以及输出结果函数也需要使用内核函数,避免内存检查时出现错误。源代码如图2-1所示。图 2-1 编写系统调用源代码4.实验结果:完成系统功能调用源代码的设计。2.2.2 阶段2 连接新的系统功能调用1.任务描述:该阶段的任务主要是使得内核的其余部分知道该系统功能调用的存在。在该阶段需要编辑两个文件,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 添加系统调用定义接着需要在系统调用表中为该系统调用分配一个系统调用名和一个系统调用号。系统调用号为359,系统调用名为mysyscall如图2-3所示。图2-3 分配系统调用号和调用名4.实验结果:完成第二阶段添加系统定义以及为系统调用分配系统调用名和系统调用号。2.2.3 阶段3 重建内核1.任务描述: 在第三阶段主要完成系统内核的重建。2.实验设计:,其完成的步骤为:1.生成内核配置文件,2.编译内核映像,3.生成并安装模块,4.安装新的系统。其中如果报错说没有对应的软件包则需要下载软件包。3.实验过程:a.首先根据自己的内核版本下载对应的内核源码,生成内核配置文件,接着编译内核映像,实现的操作为:make menuconfig。运行成功回出现一个弹出框,可以直接退出,如图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 生成并安装内核模块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.实验结果 测试结果如图2-18,图2-19所示。图 2-18 系统调用测试图 2-19 系统调用测试结果2.3 实验小结对本次实验使用的理论、技术、方法和结果进行总结。描述一下通过实验你有哪些收获。本次实验的工程量还是相当大的,其中需要是实验步骤很繁多,并且必须一步一步全部正确,不然后面的步骤无法完成。实验课程的PPT教学做的还是很完善的,只要根据要求来,每步做正确,还是很容易的。实验完成了系统功能调用的添加。从最开始的编写系统调用源代码的编写到最后的系统功能调用的测试还是遇到了很多的问题。其中的内核版本的下载一定要和自己的版本很好的兼容,不然可能或多或少出现一些不必要的麻烦。添加的系统功能调用的源代码一定要使用内核提供的函数进行编写,因为用户态的内存访问受到限制,可能会引起内存检测时出现错误。在编译内核模块和安装内核模块时需要很长的时间,需要确保在这段时间里电脑能正常的运行。不然要浪费掉很长的时间做一些重复的事情。在修改/etc/default/grub文件时可能不能直接修改,需要进行一些特殊的操作,类似获得权限。本次实验的收获良多,了解并实践了添加系统功能调用的整个过程,知道了系统功能调用的编写添加的机制,学会了怎样去添加一个新的系统功能调用。实验3: 添加设备驱动程序 3.1 实验概述 通过添加设备驱动程序掌握添加设备驱动程序的方法。3.2 实验内容采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭、读/写等基本操作编写一个应用程序,测试添加的驱动程序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 实现驱动设备功能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.实验过程:设备驱动模块的加载指令为: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.实验结果:如果生成设备文件成功,可以看见在dev目录下有一个mydev2文件,如图3-11所示。图 3-11 参看设备文件3.2.4 阶段5 编写应用程序测试1.任务描述:编写应用程序测试。2.实验设计:编写应用程序测试,将其视为文件进行操作。3.实验过程:编写应用程序,代码如图3-12所示图 3-12 生成设备文件4.实验结果:测试结果正确,如图3-13所示。图 3-13 测试结果3.3实验小结本次实验主要完成添加设备驱动程序,熟悉添加设备驱动程序的过程,主要过程有便携设备驱动程序、编译、加载、生成设备文件、测试等过程。在这期间也遇到很多问题,其中主要集中在编写设备驱动程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论