ImageVerifierCode 换一换
格式:DOCX , 页数:88 ,大小:1.52MB ,
资源ID:30417666      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30417666.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验报告范文.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统实验报告范文.docx

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