操作系统实验报告_第1页
操作系统实验报告_第2页
操作系统实验报告_第3页
操作系统实验报告_第4页
操作系统实验报告_第5页
已阅读5页,还剩11页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE华中科技大学计算机学院操作系统课程设计实验报告班级:学号:姓名:指导教师:完成日期:2010-04-02一、实验目的:掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。二、实验题目:掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。编一个C程序,其内容为实现文件拷贝的功能;编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。实现的功能是:文件拷贝;掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。实现字符设备的驱动。了解和掌握/proc文件系统的特点和使用方法(1)了解/proc文件的特点和使用方法(2)监控系统状态,显示系统中若干部件使用情况(3)用图形界面实现系统监控状态。5.设计并实现一个模拟的文件系统(选做)三、实验步骤及源代码:实验一题目一:源代码如下:#include<dos.h>#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){ FILE*f1,*f2;f1=fopen("d:\\source1.txt","r");f2=fopen("d:\\source2.txt","w");while(!feof(f1)){fputc(fgetc(f1),f2);}fclose(f1);fclose(f2);printf("拷贝完成!!\n");}创建文件copy.c,输入源代码。进入终端后使用编译命令:gcccopy2.c-ocopy2编译源代码。然后运行新生成文件./copy2,就会把source1.txt内的文字复制到source2.txt中(如果source2.txt不存在则会新建该文件)。结果如上图所示。题目二:源代码如下:3.c:#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<sys/types.h>#include<linux/sem.h>intp1,p2;intmain(void){ if((p1=fork())==0) { execv("./gtk1",NULL); } else { if((p2=fork())==0) { execv("./gtk2",NULL); } else { if(fork()==0) { execv("./gtk3",NULL); } } } return0;}

gtk1.c:#include<gtk/gtk.h>/*传到这个函数的数据被打印到标准输出*/voidcallback(GtkWidget*widget,gpointerdata){g_print("Process1-%swaspressed\n",(char*)data);}/*这个回调退出程序*/gintdelete_event(GtkWidget*widget,GdkEvent*event,gpointerdata){gtk_main_quit();returnFALSE;}intmain(intargc,char*argv[]){GtkWidget*window;GtkWidget*button;GtkWidget*table;gtk_init(&argc,&argv);/*创建一个新窗口*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/*设置窗口标题*/gtk_window_set_title(GTK_WINDOW(window),"进程一");/*为delete_event设置一个立即退出GTK的处理函数。*/g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);/*设置窗口的边框宽度。*/gtk_container_set_border_width(GTK_CONTAINER(window),20);/*创建一个2x2的表*/table=gtk_table_new(2,2,TRUE);/*将表放进主窗口*/gtk_container_add(GTK_CONTAINER(window),table);/*创建第一个按钮*/button=gtk_button_new_with_label("button1");/*当这个按钮被点击时,我们调用"callback"函数,并将一个*指向"button1"的指针作为它的参数*/g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(callback),(gpointer)"button1");/*将button1插入表的左上象限(quadrant)*/gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1);gtk_widget_show(button);/*创建第二个按钮*/button=gtk_button_new_with_label("button2");/*当这个按钮被点击时,我们调用"callback"函数,并将一个*指向"button2"的指针作为它的参数*/g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),(gpointer)"button2");/*将button2插入表的右上象限*/gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,0,1);gtk_widget_show(button);/*创建"Quit"按钮*/button=gtk_button_new_with_label("Quit");/*当这个按钮被点击时,我们调用"delete_event"函数接着*程序就退出了*/g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(delete_event),NULL);/*将退出按钮插入表的下面两个象限*/gtk_table_attach_defaults(GTK_TABLE(table),button,0,2,1,2);gtk_widget_show(button);gtk_widget_show(table);gtk_widget_show(window);gtk_main();return0;}gtk2.c和gtk3.c的源代码与gtk1.c的大致相同。依照源代码分别将gtk1.c、gtk1.c、gtk1.c和3.c文件编写好。进入终端后分别编译这几个文件。编译gtk1.c的命令为:gccgtk1.c-ogtk2`pkg-config--cflags--libsgtk+-2.0`因为该程序使用了gtk编程,所以需要在后面加上参数`pkg-config--cflags--libsgtk+-2.0`。编译3.c的命令与题目一中程序一样为:gcc3.c-o3编译完成后会生成相应的两个可执行文件。最后输入./3即可执行main程序,所得结果如上图所示,一共建立了3个进程process1、process2和process3。点击各自的quit按钮即可关闭所在的进程。实验二源代码如下:系统调用代码:asmlinkageintsys_filecopy(char*sourceFile,char*distFile)

{

intf1,f2,n;

charbuf[512];

mm_segment_tfs;

if((f1=sys_open(sourceFile,O_RDONLY,0))==-1){

printk("Can'topen%s\n",sourceFile);

sys_exit(-1);

}

if((f2=sys_open(distFile,O_CREAT|O_WRONLY|O_TRUNC,0666))==-1){

printk("Can'tcreat%s,mode%o\n",distFile,0666);

sys_exit(-1);

}

fs=get_fs();

set_fs(get_ds());

while((n=sys_read(f1,buf,512))>0)

{if(sys_write(f2,buf,n)!=n){

printk("writeerroronfile%s",distFile);

sys_exit(-1);

}

}

set_fs(fs);

sys_close(f1);

sys_close(f2);

return0;

filecopy.c(测试代码):#include<linux/unistd.h>

#include</usr/src/linux-2.6.31.12/arch/x86/include/asm/unistd.h>

#include<stdio.h>

#include<sys/syscall.h>

#define__NR_filecopy337

intmain(intargc,char*argv[])

{

inti;

if(argc!=3)

printf("error!");

else

{

i=syscall(337,argv[0],argv[1]);

printf("ok!");

}

return0;

}实验步骤如下:1.将内核包linux-2.6.31.12.tar解压到/usr/src下。2.增加新的系统调用,修改sys.c。使用命令sudogedit/usr/src/linux-2.6.31.12/kernel/sys.c打开sys.c文件,将系统调用的代码加入该文件中。3.修改系统调用表syscall_table_32.S::使用命令sudogedit/usr/src/linux-2.6.31.12/arch/x86/kernel/syscall_table_32.S打开系统调用表,在最后加上 .longsys_filecopy4.增加新系统调用号,修改unistd.h使用命令sudogedit/usr/src/linux-2.6.31.12/arch/x86/include/unistd_32.h打开该文件,在其中添加:#define__NR_filecopy337。5.编译内核,依次输入以下命令:sudocd/usr/src/linux-2.6.31.12sudomakemenuconfigsudomakebzImagesudomakemodulessudomakemodules_installsudocparch/i386/boot/bzImage/boot/vmlinuz-2.6.31.12sudomkinitramfs-oinitrd.img-2.6.31.122.6.31.126.修改grub:使用命令sudogedit/boot/grub/grub.cfg打开grub.cfg文件,仿照文件中的格式加入下列代码:menuentry"Ubuntu,Linux2.6.31.12"{

insmodntfs

setroot=(hd0,8)

search--no-floppy--fs-uuid--sete67496277495fb0f

loopbackloop0/ubuntu/disks/root.disk

setroot=(loop0)

linux/boot/vmlinuz-2.6.31.12root=/dev/sda8loop=/ubuntu/disks/root.diskroquietsplash

initrd/boot/inird-2.6.31.12.img7.重启,导入新的内核,测试。重启后选择Ubuntu,Linux2.6.31.12进入,编译写好的测试文件filecopy.c。在终端中输入gccfilecopy.c-ofilecopy编译源代码,然后输入./filecopy1.txt2.txt运行新生成文件,如果1.txt不存在,则会报错,若存在,则成功复制。运行结果如上图所示,所达成的功能与实验一相同。实验三源代码如下:device.c(驱动程序代码):#include<linux/module.h>

#include<linux/init.h>

#include<linux/fs.h>

#include<asm/uaccess.h>

MODULE_LICENSE("GPL");

#defineMAJOR_NUM147

staticssize_td_read(structfile*,char*,size_t,loff_t*);

staticssize_td_write(structfile*,constchar*,size_t,loff_t*);

staticssize_td_open(structinode*,structfile*);

staticssize_td_release(structinode*,structfile*);

structfile_operationsd_fops=

{

.read=d_read,

.write=d_write,

.open=d_open,

.release=d_release,

};

staticcharvar[1024]="Devicetest:";

intcounter=12;

staticint__initdevice_init(void)

{

intresult;

result=register_chrdev(MAJOR_NUM,"device",&d_fops);

if(result)

{

printk("deviceregisterfailure");

}

else

{

printk("deviceregistersuccess");

}

returnresult;

}

staticvoid__exitdevice_exit(void)

{

unregister_chrdev(MAJOR_NUM,"device");

printk("unloadingthedevice...");

}

staticssize_td_read(structfile*filp,char*buf,size_tlen,loff_t*off)

{

if(copy_to_user(buf,var,1024*sizeof(char)))

{

return-EFAULT;

}

returnsizeof(char);

}

staticssize_td_write(structfile*filp,constchar*buf,size_tlen,loff_t*off)

{

if(copy_from_user(var+counter,buf,len*sizeof(char)))

{

return-EFAULT;

}

counter+=len;

returnsizeof(char);

}

staticssize_td_open(structinode*inode,structfile*file)

{

printk(KERN_INFO"openit!\n");

return0;

}

staticssize_td_release(structinode*inode,structfile*file)

{

printk(KERN_INFO"closeit\n");

return0;

}

module_init(device_init);

module_exit(device_exit);Makefile(Makefile文件):ifneq($(KERNELRELEASE),)#kbuildsyntax.mymodule-objs:=device.oobj-m:=device.oelsePWD:=$(shellpwd)KVER:=$(shelluname-r)KDIR:=/lib/modules/$(KVER)/buildall: $(MAKE)-C$(KDIR)M=$(PWD)clean: rm-f*.cmd*.o*.mod*.koendifsdevice.c(测试程序代码):#include<sys/types.h>

#include<sys/stat.h>

#include<stdio.h>

#include<fcntl.h>

#include<string.h>

main()

{

intfd;

charbuffer[1024];

intnum;

fd=open("/dev/device",O_RDWR,S_IRUSR|S_IWUSR);

if(fd!=-1)

{

read(fd,buffer,1024*sizeof(char));

printf("Thedeviceis%s\n",buffer);

printf("Pleaseinputthecharacterswrittentodevice:\n");

fgets(buffer,1024,stdin);

num=st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论