操作系统课程设计报告.docx

上传人:b****4 文档编号:855089 上传时间:2022-10-13 格式:DOCX 页数:39 大小:1.06MB
下载 相关 举报
操作系统课程设计报告.docx_第1页
第1页 / 共39页
操作系统课程设计报告.docx_第2页
第2页 / 共39页
操作系统课程设计报告.docx_第3页
第3页 / 共39页
操作系统课程设计报告.docx_第4页
第4页 / 共39页
操作系统课程设计报告.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

操作系统课程设计报告.docx

《操作系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告.docx(39页珍藏版)》请在冰豆网上搜索。

操作系统课程设计报告.docx

操作系统课程设计报告

课程设计报告

课程名称:

操作系统原理

 

院系:

计算机科学与技术

专业班级:

CS140______

学号:

U201414_____

姓名:

_________

指导教师:

_________

完成时间:

2017年3月11日_

 

1实验目的2

2实验环境2

3实验内容2

3.1实验一2

3.2实验二2

3.3实验三3

3.4实验四3

3.5实验五(选做)3

4设计与实现3

4.1实验一3

4.2实验二6

4.3实验三9

4.4实验四11

5心得体会14

1实验目的

·掌握Linux操作系统的使用方法;

·了解Linux系统内核代码结构;

·掌握实例操作系统的实现方法;

2实验环境

本次课程设计采用的操作系统环境是windows10、Ubuntu双系统,Ubuntu系统版本号为16.04,内核版本号为linux4.4.4;前两个实验在当前Ubuntu环境下完成,后两个实验在win10下虚拟机VirtualBox的Ubuntu15.10(内核为linux4.2.0-42)中完成。

3实验内容

3.1实验一

要求熟悉和理解Linux下的编程环境。

(1)编写一个C程序,用fread、fwrite等库函数实现文件拷贝功能。

(2)编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK),分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。

3.2实验二

要求掌握添加系统调用的方法,采用编译内核方法,添加一个新的系统调用,实现文件拷贝的功能,另外编写一个应用程序,测试新增加的系统调用。

3.3实验三

掌握增加设备驱动程序的方法。

采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭,读/写等基本操作。

另外编写一个应用程序,测试新添加的驱动程序。

3.4实验四

要求理解和分析/proc文件。

(1)了解/proc文件的特点和使用方法;

(2)监控系统状态,显示系统部件的使用状态;

(3)用图形界面实现系统监控状态,包括CPU和内存利用率、所有进程信息等(可自己补充、添加其他功能);

3.5实验五(选做)

要求理解和掌握文件系统的设计方法(选做)。

设计、实现一个模拟的文件系统。

包括文件/目录创建/删除,目录显示等基本功能(可自行扩充文件读/写、用户登录、权限控制、读写保护等其他功能)。

4设计与实现

4.1实验一

4.1.1实验要求

要求熟悉和理解Linux下的编程环境。

4.1.2实验设计及调试

(1)编写一个C程序,其内容为实现文件拷贝的功能。

这个实验的思路是声明两个文件指针*fp_read和*fp_write,前者用来打开要读的文件,后者打开要写的文件,再创建一个1000个字节大小的缓冲区buff[],然后调用fread将内容从文件1读到buff里,再调用fwrite把内容从buff写到文件2中。

这个实验重点要掌握fread和fwrite的使用方法,注意它们的参数和返回值。

代码见附件中源码。

实验结果如下图4.1:

图4.1运行之前图

运行./lab1_1text1.txttext2.txt后结果如下图4.2:

图4.2运行之后图

由上图可见text1.txt成功拷贝至text2.txt

(2)编写一个C程序,本次实验使用的是图形界面GTK,分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。

这个实验要用到gtk,首先要配置gtk,在终端中输入:

sudoapt-getinstalllibgtk2.0-dev

涉及到3个进程的并发,所以要调用函数fork来创建3个进程。

我的思路是在这3个进程中分别创建一个线程,去完成相应的功能:

显示当前时间,监测CPU利用率,做累加求和。

分别通过函数voidhavetime()、voidcpu_usage()、voidadd()实现,在main函数里,初步画出3个进程相应的界面。

具体的是调用gtk_window_new()函数创建一个窗口、gtk_window_set_title()设置窗口标题、gtk_window_set_position设置窗口在屏幕的位置、gtk_label_new()创建一个标签用来显示文本、gtk_container_add()把标签添加到窗口中、gtk_widget_show_all()来展示需要展示的控件。

例如创建第一个线程:

g_thread_create((GThreadFunc)havetime,NULL,FALSE,NULL);

通过在线程havetime()中实时更新标签label的内容,然后在main()中创建的窗口中展示来完成所要求的功能。

进程2和3所要求的功能也是通过这种方法实现。

注意用到gtk的编译命令与以往不同,为:

gcc-olab1_2lab1_2.c`pkg-config--cflags--libsgtk+-2.0`

代码见附件中的源码,实验结果如下图4.3:

图4.3运行结果图

小插曲:

在调用sprintf(s,"CPU利用率为%f%%",usage)想把利用率的“%”拷进缓冲区s后打印出来时,一个百分号是不能够打印出来的,要写两个%,如想要打印两个%,则要写4个%,以此类推。

4.2实验二

4.2.1实验要求

要求掌握添加系统调用的方法,采用编译内核方法,添加一个新的系统调用,实现文件拷贝的功能,另外编写一个应用程序,测试新增加的系统调用。

4.2.2实验设计及调试

(1)下载一个内核https:

//www.kernel.org/pub/linux/kernel/v4.x/

下载linux-4.4.4.tar.gz

在/usr/src/目录下解压(用超级用户权限),

(2)编写新的系统调用程序

用户空间所使用的open、read、write、close函数此时对应内核函数为sys_open、sys_read、sys_write、sys_close。

首先通过sys_open()打开源文件和目标文件,分别返回文件描述符source和dest,然后把当前的用户地址范围保存在fs,再把当前内存访问地址范围设置为内核的内存地址访问范围,再通过sys_read()把源文件内容写到buf,再用sys_write()把buf内容写到dest,接着用sys_close()来关闭文件,最后再把内存访问地址范围设置为用户的。

保存fs是避免使用的缓冲区超过了用户空间的地址范围而报错。

把自己写的这个系统调用程序添加至/usr/src/linux-4.4.4/kernel目录下的sys.c最后。

(3)添加系统调用号

在/usr/src/linux-4.4.4/arch/x86/entry/syscalls目录下修改syscall_64.tbl文件,添加一个自己的调用程序的系统调用号,我的之前用到了325好,所以添加326号,如下:

326commonmysyscallsys_mysyscall

(4)添加系统调用程序的声明

在/usr/src/linux-4.4.4/include/linux目录下的syscalls.h最后加上自己添加的系统调用程序的声明如下:

asmlinkageintsys_mysyscall(char*sourceFile,char*destFile);

(5)编译、安装内核

在/usr/src/linux-4.4.4目录下对内核选项进行配置:

sudomakemenuconfig

图4.4内核配置图

选择save后退出

接下来就是漫长的编译内核了(4个线程跑会快一些):

sudomake-j4

大概1个小时左右编译完毕,再安装内核:

sudomakemodules_install//安装内核模块

sudomakeinstall//安装内核

安装完毕后重启,在Ubuntu高级选项中进入新的内核。

(6)编写系统调用测试程序

#include

#include

intmain(){

syscall(326,"text1.txt","text2.txt");

return0;

}

实验结果如下图4.5:

图4.5运行之前的图

./lab2后如下图:

图4.6运行之后的图

可见系统调用成功。

 

4.3实验三

4.3.1实验要求

掌握增加设备驱动程序的方法。

采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭,读/写等基本操作。

另外编写一个应用程序,测试新添加的驱动程序。

4.3.2实验设计及调试

(1)添加设备驱动原理:

linux设备一般分为:

字符设备、块设备和网络设备。

驱动程序运行在内核空间,应用程序通常通过文件系统接口函数访问/dev目录下的设备文件来访问驱动程序。

编写设备驱动程序的主要工作就是编写file_operations子函数,这次实验主要完成的就是file-operations数据结构中的.open\.release\.read\.write4个模块,file_operations结构的每个域都对应一个系统调用。

用户进程利用系统调用在对设备文件进行诸如read/write等操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取该数据结构相应的函数指针,接着把控制权交给该函数。

(2)编写Makefile文件

Makefile文件用于编译设备驱动程序,其内容如下:

iifeq($(KERNELRELEASE),)

KERNELDIR?

=/lib/modules/$(shelluname-r)/build

PWD:

=$(shellpwd)

modules:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules

modules_install:

$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_install

clean:

rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions

.PHONY:

modulesmodules_installclean

else

obj-m:

=mydev.o

endif

(3)编写设备功能函数

编写设备驱动程序的主要工作就是编写子功能函数。

open()函数用来打开一个设备,在该函数中可以对设备进行初始化。

如果这个函数被赋值NULL,那么设备打开永远成功,并不会对设备产生影响。

release()函数用来释放open()函数中申请的资源,并在文件引用计数为0时,被系统调用。

其对应应用程序的close()方法,但并不是每一次调用close()方法,都会触发release()函数,只有在打开的所有设备文件都释放后,该函数才会被调用。

read()函数用来从设备中获取数据,成功时返回读取的字节数,失败时返回一个负的错误码。

write()函数用来写数据到设备中。

成功时该函数返回写入的字节数。

详细实现见附件中源码。

(4)设备驱动程序安装

1make,调用Makefile编译设备驱动程序

图4.7make图

编译成功,生成mydev.k

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

当前位置:首页 > 小学教育 > 语文

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

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