华科操作系统课设报告

上传人:豆*** 文档编号:123897373 上传时间:2022-07-23 格式:DOC 页数:17 大小:463.50KB
返回 下载 相关 举报
华科操作系统课设报告_第1页
第1页 / 共17页
华科操作系统课设报告_第2页
第2页 / 共17页
华科操作系统课设报告_第3页
第3页 / 共17页
点击查看更多>>
资源描述
华中科技大学操作系统课程设计实验报告专业:计算机科学与技术 班级:1101 姓名:许阳 学号:U14241 一、 实验目的掌握Linux操作系统的使用措施;理解Linux系统内核代码构造;掌握实例操作系统的实现措施。二、 实验规定1、 掌握Linux操作系统的使用措施,涉及键盘命令、系统调用;掌握在Linux下的编程环境。l 编一种C程序,其内容为实现文献拷贝的功能;l 编一种C程序,其内容为分窗口同步显示三个并发进程的运营成果。规定用到Linux下的图形库。2、 掌握系统调用的实现过程,通过编译内核措施,增长一种新的系统调用。另编写一种应用程序,调用新增长的系统调用。实现的功能是:文献拷贝;3、 掌握增长设备驱动程序的措施。通过模块措施,增长一种新的设备驱动程序,其功能可以简朴。实现字符设备的驱动;4、 理解和掌握/proc文献系统的特点和使用措施l 理解/proc文献的特点和使用措施l 监控系统状态,显示系统中若干部件使用状况l 用图形界面实现系统监控状态。5、 设计并实现一种模拟的文献系统(选作)三、 实验一1、 编一种C程序,其内容为实现文献拷贝的功能要实现文献拷贝功能,重要用到的函数是open、write、read。此前在windows下写C语言打开文献常用的fopen,此时不能用,由于fopen是ANSIC原则中的C语言库函数,在不同的系统中应当调用不同的内核api ;因此应当直接使用linux中的系统函数open。重要用到的头文献:Unistd.h涉及了许多Linux系统服务的函数原型,如:read、writeFcntl.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 o scopy scopy.c将程序编译并生产exe可执行文献。然后手动创立一种测试文献test.txt ,在终端输入命令./scopy test.txt target.txt这样就能将源文献test.txt复制到目的文献target.txt程序源代码 scopy.c:#include #include #include #include #include #include #include #define BUFFER_SIZE 1024 /缓冲区大小int main(int argc,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); /* 创立目的文献 */ 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_fd,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、 编一种C程序,其内容为分窗口同步显示三个并发进程的运营成果。规定用到Linux下的图形库。 安装Linux下的GTK+:一方面要在Linux下载GTK+有关库文献并安装。在终端输入sudo apt-get install gnome-core-devel ,然后根据提示操作,就会安装 libgtk2.0-dev libglib2.0-dev 等开发所需的有关库文献。 $sudo apt-get 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+程序的基本环节如下:l 初始化Gtkl 建立控件l 登记消息与消息解决函数l 执行消息循环函数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 (/创立多少列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,/参数(table)是选定某表格GtkWidget*widget,/(child)是想放进去的物件gintleft_attach,/如下参数是指定把物件放在哪里, 及用多少个boxesgintright_attach,ginttop_attach,gintbottom_attach);实验截图:实验源代码:process.c:#include #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_progress_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; 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 ();int main(int argc, char *argv) int pid = fork (); if (pid 0)printf (error!n); else if (pid = 0) int pid = fork (); if (pid 0 & dest0) do i=sys_read(source,buf,4096); sys_write(dest,buf,i); while(i); else printk(Error!); sys_close(source); sys_close(dest); set_fs(fs); return 10;修改完函数之后,接下来要修改系统调用号所相应的函数名,即修改/usr/src/linux-2.6.32.10/arch/x86/include/asm/unistd_32.h该文献定义了系统调用号,我们只要找一没被使用的系统调用号,用该号给我们自定义函数使用,例如#define _NR_sys_mycall337/*定义系统调用sys_mycall 的系统调用号为337*/修改完系统调用号后,接下来要修改系统调用表,即/usr/src/linux-2.6.32.10/arch/x86/kernel/syscall_table_32.S,这个文献是用汇编语言编写的,因此要让自定义的系统调用相对于其她系统调用的顺序337个,写上.long sys_mycall /*337*/基本修改完以上源码后,接下来对其进行默认的净化、设立等。使用下列代码对其源码进行解决sudo make mrproper 净化解压后的源代码sudo make menuconfig对内核选项进行配备如果这一步有错误也许是正在使用的系统没有安装必要的库文献,如ncurses、libncurses*,这时候需要输入如下指令来安装一方面回到系统根目录sudo apt-get install ncursessudo apt-get install libncurses*根据提示就能安装好必要的库文献了。然后再回到内核源码的目录下尝试使用sudo make menuconfig对内核选项进行配备。sudo make dep 建立模块间的依赖信息sudo make clean 删除配备时留下的某些不用的文献3. 编译内核接下来是最费时间的环节,少则2个小时,多则3个小时的编译,需要再三保证前面环节与否对的后再进行下一步。sudo make bzImage编译内核这个过程大概是20多分钟sudo make modules编译内核模块这个过程大概要100分钟150分钟左右,一般如果有错误,会在前十几分钟就停止编译并报错。4. 安装内核比较简朴,只需要两条指令sudo make modules_install 安装内核模块sudo make install 安装内核安装完毕后,需要开机时选择使用新的Linux核心,要做下列修改:1)复制内核到系统启动引导目录cp /usr/src/linux-2.6.37.4/arch/i386/boot/bzImage /boot/vmlinuz-2.6.37.4-mykernel2)创立初始RAM磁盘initrd在创立之前先安装必要的程序apt-get install bootcd-mkinitramfsmkinitramfs -o /boot/initrd.img-2.6.37.43)更新grub在/boot/grub/grub.cfg中, 复制一段旧的核心代码,并将里面linux和initrd中的途径改为新增的,注意不能用update-grub2在/boot中复制一种旧的config-xxxxxx做为自己的4)cd /bootcp initrd.img-2.6.37.4 initrd-2.6.37.4.old以上是备份initrid,下面是修改depmod aupdate-initramfs -k 2.6.37.4 ccd /tmpgzip -dc /boot/initrd.img-2.6.37.4| cpio -idtouch lib/modules/2.6.37.4/modules.depfind ./ | cpio -H newc -o /boot/initrd.img-2.6.37.4.newgzip /boot/initrd.img-2.6.37.4.newcd /bootmv initrd.img-2.6.37.4.new.gz initrd.img-2.6.37.45)重开机测试5. 测试功能用C语言编写测试程序testsys.c,源代码如下:#include #include #include int main(int argc,char*argv) int i=syscall(349,argv1,argv2); /*337为系统调用号*/ printf(successfully!rn); printf(%d,i); return 1;编译gcc o testsys testsys.c运营./testsys test.txt target.txt系统调用337号功能,拷贝文献test.txt到target.txt运营成果截图如下:.【实验心得】由于上学期操作系统学习的并不太好,因此这学期做课设还是遇到了很大的困难,制作出了前二步,最后还是靠着网上的某些代码才实现了完整的功能,但是从看、这次课程设计中,我还是学到了很有用的知识,例如linux内核的编译,GTK的使用等等,也请教了许多同窗也和她们一起探讨过,从中受益匪浅。最后也谢谢教师对我一学期以来的指引!
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!