操作系统实验报告范文.docx
- 文档编号:23077270
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:88
- 大小:1.52MB
操作系统实验报告范文.docx
《操作系统实验报告范文.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告范文.docx(88页珍藏版)》请在冰豆网上搜索。
操作系统实验报告范文
课程实验报告
课程名称:
操作系统
专业班级:
计算机科学与技术xxxx班
学号:
xxxxxxx
姓名:
xxxx
指导老师:
xxxxx
报告日期:
20xx年xx月xx日
计算机科学与技术学院
课程设计概述
一、实验目的
掌握Linux操作系统的使用方法;
了解Linux系统内核代码结构;
掌握实例操作系统的实现方法。
二、实验要求
1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
●编一个C程序,其内容为实现文件拷贝的功能;
●编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
2、掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用。
实现的功能是:
文件拷贝;
3、掌握增加设备驱动程序的方法。
通过模块方法,增加一个新的设备驱动程序,其功能可以简单。
实现字符设备的驱动;
4、了解和掌握/proc文件系统的特点和使用方法
●了解/proc文件的特点和使用方法
●监控系统状态,显示系统中若干部件使用情况
●用图形界面实现系统监控状态。
5、设计并实现一个模拟的文件系统(选作)
三、设计说明
Linux系统版本12.10
新编译的内核版本3.6.11
虚拟机VMwareFusion3.0
环境MACOSX10.68
实验一
一、实验目的
1.编写一个C程序实现文件拷贝的功能
2.编写一个C程序,其内容为分窗口同时显示三个并发进程的运行结果,要求用到Linux下的图形库。
二、实验过程
1.文件拷贝功能
要实现文件拷贝功能,主要用到的函数是open、write、read。
以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api;所以应该直接使用linux中的系统函数open。
主要用到的头文件:
Unistd.h\\包含了许多Linux系统服务的函数原型,如:
read、write
Fcntl.h\\定义了很多宏和open,fcntl函数原型
Stdio.h\\标准输入输出头文件
sys/types.h\\此头文件包含适当时应使用的多个基本派生类型
sys/stat.h\\包含了获取文件属性的一些函数
errno.h\\用于调试错误代码是所需要的一些errno变量
string.h\\包含了处理字符串的一些函数
设计思路:
由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制N个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。
在可能出错的地方需要加上相应的报错代码和中断,并输出错误信息,以方便调试或是往后应用在第2小题中可能发生的错误。
理清楚设计思路后,根据需求写出相应的源代码见后页源程序代码scopy.c;在Linux终端使用编译命令gcc–oscopyscopy.c将程序编译并生产exe可执行文件。
然后手动创建一个测试文件test.txt,在终端输入命令
./scopytest.txttarget.txt
这样就能将源文件test.txt复制到目标文件target.txt
2.分窗口显示并发进程的运行结果
安装Linux下的GTK+:
首先要在Linux下载GTK+相关库文件并安装。
在终端输入sudoapt-getinstallgnome-core-devel,然后根据提示操作,就会安装libgtk2.0-devlibglib2.0-dev等开发所需的相关库文件。
$sudoapt-getinstallbuild-essential
$sudoapt-getinstallgnome-core-devel
$sudoapt-getinstallpkg-config
$sudoapt-getinstalllibgtk2.0*
编译GTK+代码时需要包含的头文件是gtk/gtk.h,此外,还必须连接若干库;比如编译test.c时用以下命令。
gcc–otesttest.c`pkg-config--cflags--libsgtk+-2.0`
在编写代码时需要用到的控件、窗口等视窗物件形态,用类GtkWidget定义其为指针类型。
编写一个GTK+程序的基本步骤如下:
●初始化Gtk
●建立控件
●登记消息与消息处理函数
●执行消息循环函数gtk_main()
之后所设计的3个进程,基本上都是以这样的方式编写代码的,因为之前曾用过OpenGL,所以在这方面掌握的比较快。
初始化主要使用的函数有
gtk_init(&argc,&argv);//启动GTK
gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口
gtk_window_set_title(GTK_WINDOW(window),"标题名");//设置窗口标题名
gtk_widget_set_usize(window,200,200);//设置窗口大小
gtk_widget_show(window);//显示窗口
建立控件的一般流程
/*创建表格准备封装*/
gtk_table_new(//创建多少列
gintrows,//创建多少栏
gintcolumns,//用来决定表格如何来定大小
ginthomogeneous);
/*这个函数是将表格table,结合到窗口window里*/
gtk_container_add(GTK_CONTAINER(window),table);
gtk_widget_show(table);//显示该表格
/*要把物件放进box中,可用以下函数*/
voidgtk_table_attach_defaults(
GtkTable*table,//参数("table")是选定某表格
GtkWidget*widget,//("child")是想放进去的物件
gintleft_attach,//以下参数是指定把物件放在哪里,及用多少个boxes
gintright_attach,
ginttop_attach,
gintbottom_attach);
三、实验结果
1.文件拷贝功能
2.分窗口显示并发进程的运行结果
四、源代码
1.文件拷贝功能
#include
#include
#include
#include
#include
#include
#include
#defineBUFFER_SIZE1024//缓冲区大小
intmain(intargc,char**argv)
{
intfrom_fd,to_fd;
intbytes_read,bytes_write;
charbuffer[BUFFER_SIZE];//设定一个缓冲区
char*ptr;
if(argc!
=3)//三个参数
{
fprintf(stderr,"Usage:
%sfromfiletofile\n\a",argv[0]);
return(-1);
}
/*打开源文件*/
if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open%sError:
%s\n",argv[1],strerror(errno));
return(-1);
}
/*创建目的文件*/
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open%sError:
%s\n",argv[2],strerror(errno));
return(-1);
}
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/*出错*/
if((bytes_read==-1)&&(errno!
=EINTR))break;
elseif(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/*出错*/
if((bytes_write==-1)&&(errno!
=EINTR))break;
/*写完了所有读的字节*/
elseif(bytes_write==bytes_read)break;
/*只写了一部分,继续写*/
elseif(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/*写的时候出错*/
if(bytes_write==-1)break;
}
}
close(from_fd);
close(to_fd);
return
(1);
}
2.分窗口显示并发进程的运行结果
#include
#include
#include
gintprogress_timeout(gpointerpbar)
{
gdoublenew_val;
chars[10];
new_val=gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(pbar))+0.01;
if(new_val>1.0)
new_val=0.0;
sprintf(s,"%.0f%%",new_val*100);
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar),new_val);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar),s);
returnTRUE;
}
voiddestroy_progress(GtkWidget*widget)
{
gtk_main_quit();
}
voidshow(intargc,char*argv[],char*title)
{
GtkWidget*window;
GtkWidget*vbox;
GtkWidget*pbar;
GtkWidget*pbar2;
GtkWidget*button;
GtkWidget*label;
inttimer;
charid_char[50];
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable(GTK_WINDOW(window),TRUE);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(destroy_progress),NULL);
gtk_window_set_title(GTK_WINDOW(window),title);
gtk_container_set_border_width(GTK_CONTAINER(window),0);
vbox=gtk_vbox_new(FALSE,10);
gtk_container_set_border_width(GTK_CONTAINER(vbox),10);
gtk_container_add(GTK_CONTAINER(window),vbox);
gtk_widget_show(vbox);
sprintf(id_char,"本进程ID:
%d",getpid());
label=gtk_label_new(id_char);
gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
gtk_widget_show(label);
sprintf(id_char,"父进程ID:
%d",getppid());
label=gtk_label_new(id_char);
gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
gtk_widget_show(label);
pbar=gtk_progress_bar_new();
gtk_box_pack_start(GTK_BOX(vbox),pbar,FALSE,FALSE,0);
gtk_widget_show(pbar);
timer=gtk_timeout_add(100,progress_timeout,pbar);
button=gtk_button_new_with_label("close");
g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),window);
gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);
GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
gtk_widget_show(button);
gtk_widget_show(window);
gtk_main();
}
intmain(intargc,char*argv[])
{
intpid=fork();
if(pid<0)
printf("error!
\n");
elseif(pid==0)
{
intpid=fork();
if(pid<0)
printf("error!
\n");
elseif(pid==0)
show(argc,argv,"process3");
else
show(argc,argv,"process2");}
else
show(argc,argv,"process1");
}
实验二
一、实验目的
掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用。
实现的功能是:
文件拷贝。
二、实验过程
1.下载并解压内核
到官方网站http:
//www.kernel.org/下载内核linux-3.6.11.tar.xz,将其放入/usr/src中,打开终端,使用下列命令对其解压:
#tar-xvflinux-3.6.11
该目录用来存放内核的源码。
2.修改内核
首先对系统调用模块添加一个自定义函数helloworld.c,即添加一个新的自定义函数到/arch/x86/kernel中。
在/include/linux/syscalls.h中添加如下代码,进行对系统调用模块的修改
asmlinkageintsys_helloworld(constchar*s_file,constchar*t_file);
接着在arch/x86/syscalls/syscall_32.tbl添加
350i386helloworldsys_helloworld
在arch/x86/kernel/Makefile中添加
obj-y+=helloworld.o
3.编译内核
依次在终端键入以下命令进行对内核的编译,此过程要持续2小时左右
sudoapt-getinstallfakerootbuild-essentialkernel-packagelibncurses5libncurses5-dev
cp/boot/config-3.5.0-17-generic./.config
makemenuconfig
load.config
make-kpkgclean
fakerootmake-kpkg--initrdkernel_imagekernel_headers
4.安装内核
编译完成内核咋终端输入以下命令对内核进行安装
sudodpkg-ilinux-image-3.6.11.Custom_i386.deb
sudodpkg-ilinux-headers-3.6.11.Custom_i386.deb
5.系统调用
使用如下命令实现对系统函数字符拷贝的调用
gcc-otestsys.ctestsys
./testsys
三、实验结果
四、源代码
helloworld.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*Movesomewhereelsetoavoidrecompiling?
*/
#include
#include
#include
#include
#ifndefSET_UNALIGN_CTL
#defineSET_UNALIGN_CTL(a,b)(-EINVAL)
#endif
#ifndefGET_UNALIGN_CTL
#defineGET_UNALIGN_CTL(a,b)(-EINVAL)
#endif
#ifndefSET_FPEMU_CTL
#defineSET_FPEMU_CTL(a,b)(-EINVAL)
#endif
#ifndefGET_FPEMU_CTL
#defineGET_FPEMU_CTL(a,b)(-EINVAL)
#endif
#ifndefSET_FPEXC_CTL
#defineSET_FPEXC_CTL(a,b)(-EINVAL)
#endif
#ifndefGET_FPEXC_CTL
#defineGET_FPEXC_CTL(a,b)(-EINVAL)
#endif
#ifndefGET_ENDIAN
#defineGET_ENDIAN(a,b)(-EINVAL)
#endif
#ifndefSET_ENDIAN
#defineSET_ENDIAN(a,b)(-EINVAL)
#endif
#ifndefGET_TSC_CTL
#defineGET_TSC_CTL(a)(-EINVAL)
#endif
#ifndefSET_TSC_CTL
#defineSET_TSC_CTL(a)(-EINVAL)
#endif
asmlinkageintsys_helloworld(constchar*s_file,constchar*t_file)
{
//printk("hello,world!
\n");
intbytes_read,bytes_write;
//fileid
intfrom_fd,to_fd;
charbuff
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 范文