操作系统原理 课程设计报告

发布 2022-10-05 13:27:28 阅读 4704

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

了解linux系统内核**结构;

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

本次课程设计采用的操作系统环境是windows10、ubuntu双系统,ubuntu系统版本号为16.04,内核版本号为linux 4.4.

4;前两个实验在当前ubuntu环境下完成,后两个实验在win10下虚拟机virtualbox的ubuntu 15.10(内核为linux4.2.

0-42) 中完成。

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

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

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

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

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

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

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

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

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

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

设计、实现一个模拟的文件系统。包括文件/目录创建/删除,目录显示等基本功能(可自行扩充文件读/写、用户登录、权限控制、读写保护等其他功能)。

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

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

这个实验的思路是声明两个文件指针*fp_read和*fp_write,前者用来打开要读的文件,后者打开要写的文件,再创建一个1000个字节大小的缓冲区buff,然后调用fread将内容从文件1读到buff里,再调用fwrite把内容从buff写到文件2中。这个实验重点要掌握fread和fwrite的使用方法,注意它们的参数和返回值。**见附件中源码。

实验结果如下图4.1:

图4.1 运行之前图。

运行。/lab1_1 后结果如下图4.2:

图4.2 运行之后图。

由上图可见成功拷贝至。

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

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

sudo apt-get install libgtk2.0-dev

涉及到3个进程的并发,所以要调用函数fork来创建3个进程。我的思路是在这3个进程中分别创建一个线程,去完成相应的功能:显示当前时间,监测cpu利用率,做累加求和。

分别通过函数void h**etime()、void cpu_usage()、void add()实现,在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)h**etime, null, false, null);

通过**程h**etime()中实时更新标签label的内容,然后在main()中创建的窗口中展示来完成所要求的功能。进程2和3所要求的功能也是通过这种方法实现。注意用到gtk的编译命令与以往不同,为:

gcc -o lab1_2 lab1_ `pkg-config --cflags --libs gtk+-2.0`

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

图4.3 运行结果图。

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

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

1) **一个内核。

**。在 /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目录下的最后。

3) 添加系统调用号。

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

326 common mysyscall sys_mysyscall

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

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

asmlinkage int sys_mysyscall(char* sourcefile,char* destfile);

5) 编译、安装内核。

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

sudo make menuconfig

图4.4 内核配置图。

选择s**e后退出。

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

sudo make -j 4

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

sudo make modules_install //安装内核模块。

sudo make install //安装内核。

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

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

#include

#include <>

int main(){

syscall(326,""

return 0;

实验结果如下图4.5:

图4.5 运行之前的图。

/lab2 后如下图:

图4.6 运行之后的图。

可见系统调用成功。

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

1)添加设备驱动原理:linux设备一般分为:字符设备、块设备和网络设备。

驱动程序运行在内核空间,应用程序通常通过文件系统接口函数访问/dev目录下的设备文件来访问驱动程序。编写设备驱动程序的主要工作就是编写file_operations子函数,这次实验主要完成的就是file-operations数据结构中的。open\.

release\.read\.write4个模块,file_operations结构的每个域都对应一个系统调用。

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

《操作系统原理》课程设计报告

姓名。学号。指导老师。起始时间 2010年3月4日。起止时间 2010年6月 22 日。为了提高同学们的自学能力,老师决定给予一项我们没有接触过的课程设计,也是我们很不熟悉,但是在it界却是很重要的一门技艺,我觉得老师的目的就是为了锻炼我们的自学力,而不是课程设计的能力,课程设计的能力是通过自学能力...

《操作系统原理》课程设计报告

操作系统原理 课程设计报告书。题目 进程控制模块的设计与实现。专业 网络工程 学号 131007111 学生姓名 李亚豪。指导教师 刘双红。完成日期 2015 12 05 第1章课题概述 3 1.1 设计要求 3 1.2 设计理论依据 3 第2章设计简介和内容 6 2.1 设计简介 6 2.2 设计...

操作系统原理课程设计

操作系统原理 课程设计。课题名称 进程调度算法。姓名 班级 学号 课程设计起止时间 2005年1月2日 2005年1月7日。指导教师成绩 课程设计任务书。进程调度算法。一 设计说明。该程序实现了进程的创建,且对该进程队列进行动态优先权抢占式和时间片轮转算法的调度。二 详细设计。1.流程图。2.程序运...