1、操作系统实验报告范文 课 程 实 验 报 告 课程名称: 操作系统 专业班级:计算机科学与技术xxxx班 学 号: xxxxxxx 姓 名: xxxx 指导老师: xxxxx 报告日期: 20xx年xx月xx日 计算机科学与技术学院课程设计概述一、实验目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。二、实验要求1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。编一个C程序,其内容为实现文件拷贝的功能;编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。2、掌握系统调
2、用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。实现的功能是:文件拷贝;3、掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。实现字符设备的驱动;4、了解和掌握/proc文件系统的特点和使用方法了解/proc文件的特点和使用方法监控系统状态,显示系统中若干部件使用情况用图形界面实现系统监控状态。5、设计并实现一个模拟的文件系统(选作)三、设计说明Linux系统版本12.10新编译的内核版本3.6.11 虚拟机VMware Fusion 3.0 环境MAC OS X 10.68实验一一、实验目的 1. 编写一个C程
3、序实现文件拷贝的功能2. 编写一个C程序,其内容为分窗口同时显示三个并发进程的运行结果,要求用到Linux下的图形库。二、实验过程1. 文件拷贝功能要实现文件拷贝功能,主要用到的函数是open、write、read。以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api ;所以应该直接使用linux中的系统函数open。主要用到的头文件:Unistd.h 包含了许多Linux系统服务的函数原型,如:read、writeFcntl.h 定义了很多宏和open,fcntl函数原型Stdio.h 标准
4、输入输出头文件sys/types.h 此头文件包含适当时应使用的多个基本派生类型sys/stat.h 包含了获取文件属性的一些函数errno.h 用于调试错误代码是所需要的一些errno变量string.h 包含了处理字符串的一些函数设计思路:由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制N个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。在可能出错的地方需要加上相应的报错代码和中断,并输出错误信息,以方便调试或是往后应用在第2小题中可能发生的错误。理清楚设计思路后,根据需求写出相应的源代码见后页源程序代码scopy.c ;在Linux终
5、端使用编译命令 gcc o scopy scopy.c将程序编译并生产exe可执行文件。然后手动创建一个测试文件test.txt ,在终端输入命令./scopy test.txt target.txt这样就能将源文件test.txt复制到目标文件target.txt2. 分窗口显示并发进程的运行结果 安装Linux下的GTK+:首先要在Linux下载GTK+相关库文件并安装。在终端输入sudo apt-get install gnome-core-devel ,然后根据提示操作,就会安装 libgtk2.0-dev libglib2.0-dev 等开发所需的相关库文件。 $sudo apt-g
6、et install build-essential$sudo apt-get install gnome-core-devel$sudo apt-get install pkg-config$sudo apt-get install libgtk2.0*编译GTK+代码时需要包含的头文件是gtk/gtk.h,此外,还必须连接若干库;比如编译test.c时用以下命令。gcc o test test.c pkg-config -cflags -libs gtk+-2.0在编写代码时需要用到的控件、窗口等视窗物件形态,用类GtkWidget定义其为指针类型。 编写一个GTK+程序的基本步骤如下:初
7、始化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(wi
8、ndow); /显示窗口 建立控件的一般流程 /*创建表格准备封装*/ gtk_table_new ( /创建多少列gint rows, /创建多少栏gint columns, /用来决定表格如何来定大小gint homogeneous); /*这个函数是将表格table,结合到窗口window里*/ gtk_container_add(GTK_CONTAINER(window),table);gtk_widget_show(table); / 显示该表格/*要把物件放进box中,可用以下函数*/void gtk_table_attach_defaults (GtkTable*table, /
9、参数(table)是选定某表格GtkWidget*widget, /(child)是想放进去的物件gintleft_attach, /以下参数是指定把物件放在哪里, 及用多少个boxesgintright_attach,ginttop_attach,gintbottom_attach);三、实验结果1. 文件拷贝功能 2. 分窗口显示并发进程的运行结果四、源代码1. 文件拷贝功能#include #include #include #include #include #include #include #define BUFFER_SIZE 1024 /缓冲区大小int main(int ar
10、gc,char *argv) int from_fd,to_fd; int bytes_read,bytes_write; char bufferBUFFER_SIZE; /设定一个缓冲区 char *ptr; if(argc!=3) /三个参数 fprintf(stderr,Usage:%s fromfile tofilena,argv0); return(-1); /* 打开源文件 */ if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,Open %s Error:%sn,argv1,strerror(errno); return(-1)
11、; /* 创建目的文件 */ if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,Open %s Error:%sn,argv2,strerror(errno); return(-1); while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) /* 出错*/ if(bytes_read=-1)&(errno!=EINTR) break; else if(bytes_read0) ptr=buffer; while(bytes_write=write(to_f
12、d,ptr,bytes_read) /* 出错*/ if(bytes_write=-1)&(errno!=EINTR)break; /* 写完了所有读的字节 */ else if(bytes_write=bytes_read) break; /* 只写了一部分,继续写 */ else if(bytes_write0) ptr+=bytes_write; bytes_read-=bytes_write; /* 写的时候出错*/ if(bytes_write=-1)break; close(from_fd); close(to_fd); return(1);2. 分窗口显示并发进程的运行结果#in
13、clude #include #include gint progress_timeout( gpointer pbar ) gdouble new_val; char s10; 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_pr
14、ogress_bar_set_text (GTK_PROGRESS_BAR (pbar),s); return TRUE; void destroy_progress( GtkWidget *widget) gtk_main_quit ();void show(int argc,char *argv,char *title ) GtkWidget *window; GtkWidget *vbox; GtkWidget *pbar; GtkWidget *pbar2; GtkWidget *button; GtkWidget *label; int timer; char id_char50;
15、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
16、_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 = g
17、tk_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 ();
18、 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 (
19、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 ();int main(int argc, char *argv) int pid = fork (); if (pid 0) printf (error!n); else if (pid = 0) int pid = fork
20、(); if (pid 0) printf (error!n); else if (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中,打开
21、终端,使用下列命令对其解压:#tar -xvf linux-3.6.11该目录用来存放内核的源码。 2. 修改内核首先对系统调用模块添加一个自定义函数helloworld.c,即添加一个新的自定义函数到/arch/x86/kernel中。在/include/linux/syscalls.h中添加如下代码,进行对系统调用模块的修改asmlinkage int sys_helloworld(const char* s_file, const char* t_file); 接着在arch/x86/syscalls/syscall_32.tbl添加350 i386 helloworld sys_hel
22、loworld 在arch/x86/kernel/Makefile中添加 obj-y += helloworld.o 3. 编译内核依次在终端键入以下命令进行对内核的编译,此过程要持续2小时左右sudo apt-get install fakeroot build-essential kernel-package libncurses5 libncurses5-devcp /boot/config-3.5.0-17-generic ./.configmake menuconfigload .configmake-kpkg cleanfakeroot make-kpkg -initrd kern
23、el_image kernel_headers 4. 安装内核编译完成内核咋终端输入以下命令对内核进行安装sudo dpkg -i linux-image-3.6.11.Custom_i386.debsudo dpkg -i linux-headers-3.6.11.Custom_i386.deb 5. 系统调用使用如下命令实现对系统函数字符拷贝的调用gcc -o testsys.c testsys ./testsys三、实验结果四、源代码helloworld.c#include #include #include #include #include #include #include #in
24、clude #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 #inclu
25、de #include #include /* Move somewhere else to avoid recompiling? */#include #include #include #include #ifndef SET_UNALIGN_CTL# define SET_UNALIGN_CTL(a,b) (-EINVAL)#endif#ifndef GET_UNALIGN_CTL# define GET_UNALIGN_CTL(a,b) (-EINVAL)#endif#ifndef SET_FPEMU_CTL# define SET_FPEMU_CTL(a,b) (-EINVAL)#e
26、ndif#ifndef GET_FPEMU_CTL# define GET_FPEMU_CTL(a,b) (-EINVAL)#endif#ifndef SET_FPEXC_CTL# define SET_FPEXC_CTL(a,b) (-EINVAL)#endif#ifndef GET_FPEXC_CTL# define GET_FPEXC_CTL(a,b) (-EINVAL)#endif#ifndef GET_ENDIAN# define GET_ENDIAN(a,b) (-EINVAL)#endif#ifndef SET_ENDIAN# define SET_ENDIAN(a,b) (-EINVAL)#endif#ifndef GET_TSC_CTL# define GET_TSC_CTL(a) (-EINVAL)#endif#ifndef SET_TSC_CTL# define SET_TSC_CTL(a) (-EINVAL)#endifasmlinkage int sys_helloworld(const char* s_file, const char* t_file) /printk(hello,world!n); int bytes_read, bytes_write; /file id int from_fd, to_fd; char buff
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1