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