《操作系统课程设计》实验报告学号:姓名:苏州大学计算机科学与技术学院2014年9月操作系统课程设计实验报告目录目录 (1)一、实验环境 (2)二、实验报告总体要求 (2)实验一编译L INUX内核 (3)实验二观察L INUX行为 (7)实验三进程间通信 (14)操作系统课程设计实验报告一、实验环境Linux平台◆硬件平台:普通PC机硬件环境。
◆操作系统:Linux环境,例如,红旗Linux或Red Hat Linux;启动管理器使用GRUB。
◆编译环境:伴随着操作系统的默认gcc环境。
◆工作源码环境:一个调试的内核源码,版本不低于2.4.20。
二、实验报告总体要求在2013年11月25日前提交实验报告。
实验报告至少要求包含以下内容:1.引言:概述本次实验所讨论的问题,工作步骤,结果,以及发现的意义。
2.问题提出:叙述本篇报告要解决什么问题。
注意不可以抄写实验要求中的表述,要用自己的话重新组织我们这里所提出的问题。
3.解决方案:叙述如何解决自己上面提出的问题,可以用小标题 3.1,3.2…等分开。
这是实验报告的关键部分,请尽量展开来写。
注意,这部分是最终课程设计的基本分的部分。
这部分不完成,本课程设计不会及格。
4.实验结果:按照自己的解决方案,有哪些结果。
结果有异常吗?能解释一下这些结果吗?同别人的结果比较过吗?注意,这部分是实验报告出彩的地方。
本课程设计要得高分,应该在这部分下功夫。
5.结束语:小结并叙述本次课程设计的经验、教训、体会、难点、收获、为解决的问题、新的疑惑等。
6.附录:加了注释的程序清单,注释行数目至少同源程序行数目比1:2,即10行源程序,至少要给出5行注释。
操作系统课程设计实验报告实验一编译Linux内核实验时间6小时实验目的认识Linux内核的组成,掌握配置、编译、安装Linux内核的步骤。
实验目标下载2.6.19或更新的Linux内核,配置该内核使其支持NTFS,并在新的内核中修改其版本为Linux NameTestKernel x.x.x,其中,Name是你的名字(汉语拼音);x.x.x是新内核的版本号,最后在你的机器上编译安装这个新内核。
背景知识参见《Red Hat Enterprise Linux 4入门与提高》第20章。
实验步骤1.验证gcc的可用:在你自己的工作目录下,编译链接运行Hello World程序。
2.在上下载指定的内核,或者查找更新的稳定版内核并下载之。
3.准备相关工具。
提示:如当前运行的Linux内核是基于2.4版本的,则需要更新以下软件:module-init-tools 和mkinitrd。
具体更新信息可参见下载内核源代码中的Documentation/Changes这个文件。
4.把源代码解压缩至/usr/src中,最终形成/usr/src/linux x.x.x/目录(x.x.x是新内核的版本号)。
提示:这里的注意点是路径的选择,一般要放在/usr/src/linux x.x.x/目录下面,以满足Makefile 对路径设置的初始要求。
5.进入源代码的根目录(/usr/src/linux x.x.x),找到合适自己的内核配置方法,并按照实验目标对其进行配置。
操作系统课程设计实验报告6.修改/usr/src/linux x.x.x/include/linux/version.h文件中的版本信息。
注:如果没有这个文件,请执行命令:make include/linux/version.h7.编译内核。
8.安装模块文件。
9.安装内核文件。
10.重新启动新内核。
实验结果1.实验步骤1中,编译链接运行程序你下达了哪些命令?2.实验步骤2中,你下载了哪个版本的内核文件?3.实验步骤3中,你是否安装了相关工具?如安装,则写出安装过程。
4.实验步骤4中,你是用哪些命令解压缩内核文件的?5.实验步骤5中,你用了哪种内核配置的方法?6.你对实验步骤6中涉及的文件做了怎样的修改?7.实验步骤7-9的过程,是否出现错误?如有,你是如何解决的?8.观察你机器中GRUB的配置文件,它在安装完新内核后发生了哪些变化?9.新内核启动过程是否成功?如有错误,是哪些错误?你是如何消错的?操作系统课程设计实验报告(如不够,可另附页)实验报告操作系统课程设计实验报告操作系统课程设计实验报告实验二观察Linux行为实验时间6小时实验目的学习Linux内核、进程、存储和其他资源的一些重要特征。
实验目标编写一个程序使用/proc机制检查反映机器平均负载、进程资源利用等方面的各种内核值。
在得到内核状态之后,将所观察到的行为在屏幕上输出。
背景知识Linux、Solaris和其他版本的UNIX提供了一种非常有用的检查内核状态机制,叫做/proc文件系统。
这是可以用来完成本练习的关键机制。
1. /proc文件系统/proc文件系统是一种操作系统机制,它的接口就像传统UNIX文件系统的一个目录(在根目录中)。
可以改变到/proc正如改变到任何其他目录,例如,bash$ cd /proc使/proc作为当前目录。
一旦把/proc作为当前目录,就可以用ls命令列出它的内容。
其内容看起来像普通的文件和目录。
但是,/proc或者其子目录中的文件实际上是读取内核变量并以ASCII字符串方式报告它们的程序。
这些例程中的一些仅在伪文件打开时读取内核表,而其他例程在每次文件被访问时读表。
因此各种读函数的工作方式可能与预期的有所不同,因为它们并没有在真正操作文件。
Linux提供的/proc实现可以读取很多不同的内核表。
/proc中包含一些目录和文件,每个文件读取一个或多个内核变量。
而具有数字名称的子目录包括更多的伪文件读取其进程ID和目录名相同的进程的有关信息。
self目录包含了正在使用/proc 进程的特定进程信息。
/proc目录树的确切内容随Linux的版本而不同,所以必须对伪文件进行实验查看所提示的信息。
操作系统课程设计实验报告/proc中的文件可以像普通的ASCII文件一样进行读取。
例如,向shell敲入以下命令:bash$ cat /proc/version将得到打印到stdout的类似下面的信息:Linux version 2.2.12 (gcc version egcs-2.91.6619990314/Linux (egcs-1.1.2 release)) #1 Mon Sep 27 10:40:35EDT 1999为了读取一个伪文件的内容,可以打开文件然后使用stdio程序库中的例程如fgets()或者fscanf()来读取文件。
所读的确切文件(和表)依赖于所使用的特定Linux 版本。
想要知道到底有些什么文件接口通过/proc对你可用,请查看系统上的proc 使用手册页。
2.使用argc和argv在程序的B部分和C部分,需要从shell向程序传递参数。
Linux中,C主程序依然可以采用argc和argv来传递参数。
具体用法这里不再赘述。
问题陈述1. 编写一个程序,通过检查内核状态报告Linux内核行为。
程序在stdout上打印以下信息:●CPU类型和型号。
●内核版本●从系统最后一次启动以来的时间,形式为dd:hh:mm:ss(例如,3天13小时46分32秒应该写出03:13:46:32)。
2. 改写A部分程序,加入命令行参数,在stdout上再打印以下信息:●CPU花费在用户态、系统态和空闲态的时间。
●系统接收到的磁盘请求。
●内核执行的上下文转换的次数。
●系统最后启动的时间。
●从系统启动开始创建的进程数。
3. 改写B部分程序,根据不同的命令行参数,在stdout上再打印以下信息:操作系统课程设计实验报告●计算机配置的内存数量。
●当前可用的内存数量。
●平均负载列表(至上一分钟的平均数)。
该信息将使另外的程序可以查看各个时间的这些值,因此用户可以了解平均负载如何随时间间隔而变化。
对于本程序,提供两个命令行参数:(1) 一个表明应该以什么样的频率从内核读取平均负载。
(2) 一个表明应该以多长的时间间隔读取平均负载。
A部分程序可以叫做ksamp,B部分程序ksamp –s,C部分程序ksamp –l 2 60,表示平均负载观察将运行60秒,每隔2秒取样一次。
为了观察系统上的负载,需要确保计算机正在做一些其他的工作而不是仅仅运行你的程序。
例如,打开和关闭窗口、移动窗口,甚至在其他窗口运行一些程序。
组织方案对于B部分和C部分,程序必须在命令行上有不同的参数。
因此最先的动作之一应该是解析调用程序的命令行以确定通过argv数组传递到它的shell参数。
可参考如下代码:int main( int argc, char *argv[] ) {char repTypeName[16];…// 决定报告类型reportType = STANDARD;strcpy( repTypeName, “Standard” );if ( argc > 1) {sscanf( argv[1], “%c%c”, &c1, &c2 );if ( c1 != “-“ ) {fprintf( stderr, “usage: observer [-s] [-l int dur] \n” );exit(1);}if ( c2 == ‘s’ ) {reportType = SHORT;strcpy( repTypeName, “Short” );}if ( c2 == ‘l’ ) {reportType = LONG;strcpy( repTypeName, “Long” );internal = atoi( argv[2] );duration = atoi( argv[3] );}}…}在得到今天的当前时间并打印出一个包含你所检查机器名字的问候之后,就完成了初始化工作。
#include <sys/time.h>…// 完成初始化gettimeofday( &now, NULL ); //得到当天时间printf( “Status report type %s at %s\n”, repTypeName, ctime( &( _sec ) ) );// 得到主机文件名并打印它thisPorcFile = fopen( “/proc/sys/kernel/hostname”, “r” );fgets( lineBuf, LB_SIZE+1, thisPorcFile );printf( “Machine hostname: %s”, lineBuf );fclose( thisPorcFile );现在可以准备开始工作,也就是说,通过使用各种/proc文件开始读取内核变量。