欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    华中科技大学计算机学院操作系统课程设计报告1.docx

    • 资源ID:5938813       资源大小:1.04MB        全文页数:31页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    华中科技大学计算机学院操作系统课程设计报告1.docx

    1、华中科技大学计算机学院操作系统课程设计报告1华中科技大学嵌入式操作系统课程设计实验报告 院 系: 计算机科学与技术学院专 业: 班 级: 姓 名: 指导老师: 报告时间: 计算机科学与技术学院1、课程设计目的32、课程设计环境搭建33、内容一:熟悉与理解Linux编程环境 3、1 内容要求5 3、2 设计过程及实现54、内容二:掌握添加系统调用的方法 4、1 内容要求9 4、2 设计过程及实现95、内容三:掌握添加设备驱动程序的方法 5、1 内容要求 17 5、2 设计过程及实现 176、内容四:理解与分析/proc文件 6、1 内容要求 22 6、2 设计过程及实现 221 课程设计目的(1

    2、)掌握Linux操作系统的使用方法;(2)了解Linux系统内核代码结构;(3)掌握实例操作系统的实现方法。2 课程设计环境搭建(1)windows 7上,利用虚拟机软件VMware软件搭建的linux平台: Ubuntu 11、10 (安装包:ubuntu-11、10-desktop-i386) 内核:linux-headers-3、0、0-12-generic (2)更改root登录: 在现阶段Ubuntu的系统中,就是不允许直接以root身份登录系统的,但就是在做课设的过程中,需要大量的使用root权限来进行命令的操作。如果以普通用户登录ubuntu,会连编辑一个文件都非常周折。为此,我

    3、找到了一种修改系统文件,以达到直接使用root身份登录的方法: 开始的时候,只能以普通用户登录,用Ctrl+Alt+T打开终端: 初始化/修改root密码 sudo passwd root 用vi编辑器修改这个文件: sudo vi /etc/lightdm/lightdm、conf 在文件最后加入这么一行代码: greeter-show-manual-login=true 然后保存退出,sudo reboot 重启系统。之后就可以输入root用户登录。(3)在添加系统调用中用到的其她内核包: 下载与当前实验环境最为接近的系统版本(这点很重要) 使用apt-get install linux-

    4、source-3、0、0 命令, 下载结果就是linux-source-3、0、0、tar、bz2 解压命令:tar xjvf linux-source-3、0、0、tar、bz2 C /usr/src 解压后,在/usr/src目录下得到内核文件夹linux-source-3、0、0(4)在调用linux图形库时需要安装GTK环境: 安装gcc/g+/gdb/make 等基本编程工具 apt-get install build-essential Tip:如果提示由于依赖项不能安装,需要使用apt的强化版aptitude,这个工具可以自动分析软件包依赖,系统一般不自带,需要先安装,具体过程就

    5、是: apt-get install aptitude aptitude install build-essential aptitude这个工具很强大,对于解决软件包安装时的依赖问题很有帮助。 安装 libgtk2、0-dev libglib2、0-dev 等开发相关的库文件: apt-get install gnome-core-devel 安装GTK核心组件: apt-get install libgtk2、0-dev 这个安装完成后,GTK环境就基本搭建成功,网上有些教程说要安装其她配置文件,经我亲测,发现只要安装libgtk2、0-dev这个包就能搞定。3 内容一:熟悉与理解Linu

    6、x编程环境3、1 内容要求(1)编写一个C程序,实现文件拷贝功能(2)编写一个C程序,使用Linux下的图形库,分窗口显示三个并发进程运行;3、2 设计过程及实现(1)文件拷贝: 文件的拷贝主要的思想就就是利用文件指针操作,在两个文件之间进行按字符的fget与fput。从而完成整个文件的拷贝操作。在这个基本功能之外,需要增加程序的健壮性,具体有以下几个方面: 源文件就是否存在且能读取数据; 就是否能创建目的文件,且能向里面写入数据; 程序需要的argc参数个数就是否满足要求; 基于以上几点与内容要求,主要的程序段如下:if(argc!=3) /判断参数个数就是否为3 ,否则返回 printf(

    7、Error in argc!n); return 0;if( (fsource=fopen(argv1,rb)=NULL ) printf(Error in open source file!n); /判断源文件就是否能打开与读出 return 0;if( (ftarget=fopen(argv2,wb)=NULL ) printf(Error in open target file!n); /判断目的文件时候能创建与写入 return 0;while(c=fgetc(fsource)!=EOF) fputc(c,ftarget); /按字符读取与写入数据 执行结果如下: 将source/so

    8、urce、txt文件拷贝到到target、txt,开始时如下图3-1所示:图3-1 复制开始前source/source、txt文件内容 利用mycopy程序复制,查瞧target、txt文件复制结果如下图3-2所示:图3-2 复制后target、txt文件的具体内容(2)实现三个进程之间的并发程序: 这里需要用到课程实验时的fork( )程序以及GTK的图形显示。 基本fork()程序,调用显示一个父进程与两个子进程的结构如下: if(pid_1=fork()=0) printf(Child 1# is running、n); /第一个子进程 Child 1# show(argc,argv,

    9、This is Child 1#); /调用函数显示窗口 else if(pid_2=fork()=0) printf(Child 2# is running、n); /第二个子进程 Child 2# show(argc,argv,This is Child 2#); /调用函数显示窗口 else printf(Parent # is running、n); /父进程 Parent # /由于父进程需要显示全部子进程PID,所以这里直接用参数画窗口 调用GTK显示窗体函数模块的结构:void show(int argc,char *argv ,char *title ) gtk_init (&

    10、argc, &argv); /初始化工具包并且获取命令行参数; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /创建新的窗口; /设定窗口的位置; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /监听窗口的destroy事件;g_signal_connect (G_OBJECT (window), destroy, G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (win

    11、dow), title);/用来设定更改窗口标题; gtk_container_set_border_width (GTK_CONTAINER (window), 20);/设定宽度; /使用gtk_vbox_new函数建立纵向组装盒; /为了显示构件,必须将构件放入组装盒中,并将组装盒放在窗口内; vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 100);/设定宽度; gtk_container_add (GTK_CONTAINER (window), vbox);

    12、gtk_widget_show (vbox); /使用gtk_box_pack_start函数将构件放到组装盒中; sprintf (id_char, %s ,My ID:%d, title,getpid (); /显示PID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); sprintf (id_char, 父进程ID:%d, getppid (); /显示PPID号 label = gtk_labe

    13、l_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); button = gtk_button_new_with_label (close); /关闭窗口按钮 /信号登记函数,监听按钮的clicked事件。 /当窗口clicked时, gtk_widget_destroy 就会被调用。 /而 gtk_widget_destroy 函数又调用 gtk_main_quit() 结束程序运行。 g_signal_connect_s (G_OBJECT

    14、 (button), clicked, G_CALLBACK (gtk_widget_destroy), window); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 10); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); /函数显示窗口中的组件 gtk_widget_show (button); gtk_widget_show (window); /准备将窗口与所有的组件显示在屏幕上,函数必须在GTK程序

    15、的最后调用、 gtk_main (); 编译代码forkgtk、c,运行; 编译命令为:gcc -o forkgtk forkgtk、c pkg-config -cflags -libs gtk+-2、0 程序运行结果如下图3-3所示:图3-3 三个并行显示窗口4、内容二:掌握添加系统调用的方法4、1 内容要求(1)采用编译内核的方法,添加一个新的系统调用。(2)编写一个应用程序,测试新添加的系统调用。(3)系统调用的功能:文件拷贝。4、2 设计过程及实现 在这一个部分,投入了比较多的时间。总结起来,主要有这么几个方面: linux内核版本的不同,linux2、X与linux3、X直接添加系统

    16、调用与重新编译内核的方法有差异,甚至linux2、X之间,内核文件也有变化。 再加上相关资料的步骤与方法不尽相同,甚至还有互斥的步骤,这就使得这个推进比较漫长。我之前的Ubuntu版本就是13、04,后来发现因为就是64位的,行不通,只好换了一个低版本的Ubuntu11、10,经过自己的实际工作,下面就是在运行成功之后,总结的一个过程。(环境与内核配置见本报告第二部分)(1)修改Makefile文件,修改系统版本后缀:如下图4-1所示:这里加的就是本人的姓名的首字母,以示区分。图4-1 修改Makefile文件版本(2)修改/usr/src/ linux-source-3、0、0/kernel

    17、/目录下的sys、c文件,在最后加入新的系统调用,拷贝函数实现。如下所示:asmlinkage int sys_zcycopy char* s_file, const char* t_file) const int BUF_SIZE = 512; int fin,fout; char bufBUF_SIZE; int copy_count; mm_segment_t fs; /段操作的初始化 fs = get_fs(); set_fs(get_ds(); /* 系统调用打开源文件,若失败,返回-1 */ if (fin = sys_open(s_) = -1) return -1; print

    18、k(Error in oen source file!); /* 系统调用创建并打开目标文件,若失败,返回-2 */ if (fout = sys_open(t_ | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR) = -1) return -2; printk(Errod in open target file!); while(copy_count=sys_read(fin,buf,BUF_SIZE) /* 拷贝文件,若失败,返回-3 */ if (copy_count = -1 | sys_write(fout,buf,copy_count) = -1) ret

    19、urn -3; printk(Error in copy file!); set_fs(fs); /* 段操作结束 */ return 0; (3)修改/usr/src/ linux-source-3、0、0/arch/x86/include/asm/文件夹下面头文件:unistd_32、h,在文件的系统调用号部分添加一个新的系统调用,具体添加行如下: #define _NR_sys_zcycopy同时把下面的总调用号加1,变成348。具体截图如下图4-2所示。图4-2 添加系统调用号(4)修改/usr/src/ linux-source-3、0、0/x86/kernel/syscall_ta

    20、ble_32、s, 加入新的一行: 、long sys_zcycopyfile /* 347 */ 具体实现如下图4-3所示:图4-3 填写系统调用入口表 当用户程序需要系统提供服务的时候,比如347号调用sys_zcycopyfile,就会通过系统调用产生一个int 0x80的软中断,就会进入到系统调用的入口函数,找到这个调用函数表查找入口函数,也就就是这里的、long sys_zcycopyfile,进而在sys、c中找到具体的函数实现asmlinkage int sys_zcycopy char* s_file, const char* t_file) ,从而实现系统调用。(5)配置内核

    21、:(先cd到下载的新的内核包) 净化解压后的源代码 make mrproper 安装ncurses环境: apt-get install libncurses5-dev ncurses就是一个能提供基于文本终端窗口功能的动态库, 提供字符终端处理库,包括面板与菜单。 对内核选项进行配置 make menuconfig 执行命令之后,会弹出一个框,提示对内核裁剪或配置。这次用不到变化内核模块,直接用键盘方向键选项就行了。 建立模块间的依赖信息 make dep 这一步正常情况会提示用户多此一举 删除配置时留下的一些不用的文件 make clean 这一步一般没动作,除非就是失败后再次编译内核时要

    22、用到。(6)编译内核: 编译内核文件bzImage: make bzImage j9这一步耗费的时间比较长,所以加了一个 -j9,这种方法使用多线程编程,实际使用时发现能很大的提高效率。(这个视CPU而定,要瞧CPU最多支持几个线程)编译内核模块: make modules j9 (7)安装内核经过最麻烦的编译内核,接下来的安装内核就显得容易多了,输入命令 sudo make modules_install 安装内核模块 sudo make install 安装内核同样,如果嫌时间太慢的话,同样可以在最后加上 j9 (8)环境修改: 接下来主要就是将编译安装生成的操作系统让系统引导程序“知道”

    23、,具体过程如下图4-4所示:图4-4 环境修改具体如下: 复制内核到boot目录: cp arch/i386/boot/bzImage /boot/vmlinuz-3、0、69、zcy 可利用Tab快速补全路径与文件,这样方便又不容易出错。 建立要载入ramdisk的映像文件 mkinitramfs 3、0、69、zcy -o /boot/initrd、img-3、0、69-zcy 更新启动项文件grub2、conf,直接输入命令update-grub2就行。(9)最后需要修改/boot/grub/ 目录下 grub、cfg文件; 进入文件之后,按 Ctrl+F 查找 timeout ,将所有

    24、的timeout数值改为100;这个数值的单位就是秒,这么做的目的就是修改启动项的暂停时间,以便让用户有足够的时间选择要进入的操作系统。(10)重启,进入新系统:启动项如下图4-5所示:图4-5 系统启动项 原版本内核比新内核小,入口在Previous Linux version 目录下,如下图4-6所示:以上做的工作相当于在添加新的系统调用的同时还更新了系统。图4-6 旧的系统入口显示(11)进入新系统之后,输入命令uname a / -r查瞧系统新版本:执行情况如下图4-7所示。可知已经成功的进入到修改后的新内核3、0、69、zcy图4-7 显示新内核信息(12)编写测试程序zcopy、c

    25、,如下图4-8所示:图4-8 测试程序,检测新的第347号系统调用(13)编译运行,生成执行文件。然后瞧执行程序就是否可以实现文件的拷贝,执行结果如下图4-9与图4-10所示,可瞧到已经成功的实现了预计的功能。图4-9 执行程序图4-10 程序执行显示结果5、内容三:掌握添加设备驱动程序的方法5、1 内容要求(1)采用模块方法,添加一个新的设备驱动程序。(2)要求添加字符设备的驱动。(3)编写一个应用程序,测试添加的驱动程序5、2 设计过程及实现 (1)Linux内核中的设备驱动程序就是一组常驻内存的具有特权的共享库,就是低级硬件处理例程。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各

    26、种不同设备提供了一致的接口,一般来说就是把设备映射为一个特殊的设备文件,用户程序可以象对其它文件一样对此设备文件进行操作。 Linux支持3种设备:字符设备、块设备与网络设备。 设备由一个主设备号与一个次设备号标识。主设备号唯一标识了设备类型,即设备驱动程序类型,它就是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到的那个设备。 一个典型的驱动程序,大体上可以分为这么几个部分: 注册设备: 在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主设备号; 定义功能函数: 对于每一个驱动函数来说,都有一

    27、些与此设备密切相关的功能函数。以最常用的块设备或者字符设备来说,都存在着诸如 open()、read()这一类的操作。当系统调用这些调用时,将自动的使用驱动函数中特定的模块。来实现具体的操作; 卸载设备: 在不用这个设备时,可以将它卸载,主要就是从/proc 中取消这个设备的特殊文件。 (2)编写Makefile文件如下:ifneq ($(KERNELRELEASE),) obj-m := zcydriver、o /obj-m表示编译连接后将生成zcydriver、o模块elsePWD :=$(shell pwd) /PWD为当前目录KVER :=$(shell uname -r) /KVER

    28、为当前系统内核版本KDIR :=/lib/modules/$(KVER)/buildall: $(MAKE) -C $(KDIR) M=$(PWD) /调用内核模块编译clean:# rm -f *、cmd *、o *、mod *、ko rm -rf 、*、cmd *、o *、mod、c *、ko 、tmp_versions# $(MAKE) -C $(KDIR) M=$(PWD) cleanendif 调用Makefile文件之后,其具体过程如下: KERNELRELEASE就是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE

    29、没有被定义,所以make将读取执行else之后的内容; 如果make的目标就是clean,直接执行clean操作,然后结束。 当make的目标为all时,-C $(KDIR)指明跳转到内核源码目录下读取那里的Make$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。 当从内核源码目录返回时,KERNELRELEASE已被定义,内核的build程序Kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。 else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。(3)编写设备功能函数:(zcydriver、


    注意事项

    本文(华中科技大学计算机学院操作系统课程设计报告1.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开