华科操作系统实验讲解学习.docx

上传人:b****2 文档编号:2142792 上传时间:2022-10-27 格式:DOCX 页数:19 大小:1.08MB
下载 相关 举报
华科操作系统实验讲解学习.docx_第1页
第1页 / 共19页
华科操作系统实验讲解学习.docx_第2页
第2页 / 共19页
华科操作系统实验讲解学习.docx_第3页
第3页 / 共19页
华科操作系统实验讲解学习.docx_第4页
第4页 / 共19页
华科操作系统实验讲解学习.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

华科操作系统实验讲解学习.docx

《华科操作系统实验讲解学习.docx》由会员分享,可在线阅读,更多相关《华科操作系统实验讲解学习.docx(19页珍藏版)》请在冰豆网上搜索。

华科操作系统实验讲解学习.docx

华科操作系统实验讲解学习

 

华科操作系统实验

 

课程实验报告

课程名称:

操作系统课程设计

专业班级:

学号:

姓名:

指导教师:

报告日期:

计算机科学与技术学院

 

实验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进程3

2.分别为这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的代码添加新的系统调用的函数定义。

asmlinkagelongsys_mysyscall(intnumber);接着需要修改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.首先根据自己的内核版本下载对应的内核源码,生成内核配置文件,接着编译内核映像,实现的操作为:

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安装新的系统

2.2.4阶段4修改grub文件

将/etc/default目录下的grub文件注释掉GRUB_HIDDEN_TIMEOUT=0,然后运行update-grub命令。

如图2-14所示。

图2-14注释掉GRUB_HIDDEN_TIMEOUT=0

2.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.完成函数关系绑定

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1