10操作系统课程设计-李胜利

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

12集群与网格计算湖北省重点实验室服务计算技术与系统教育部重点实验室3操作系统课程设计20114内容简介设计目的设计内容实施方法及要求时间安排辅导5设计目的掌握Linux操作系统的使用方法了解Linux系统内核代码结构掌握实例操作系统的实现方法6内容简介设计目的设计内容实施方法及要求时间安排辅导7设计内容(1)要求熟悉和理解Linux编程环境内容编写一个C程序,使用Linux下的图形库,分窗口显示三个并发进程的运行。8设计内容(2)要求掌握添加设备驱动程序的方法内容采用模块方法,添加一个新的设备驱动程序要求添加字符设备的驱动编写一个应用程序,测试添加的驱动程序9设计内容(3)要求理解和分析/proc文件内容了解/proc文件的特点和使用方法监控系统状态,显示系统中若干部件的使用情况用图形界面显示系统监控状态10设计内容(4)要求理解和掌握文件系统的设计方法(选做)内容设计、实现一个模拟的文件系统例如:最简单的方法:用一个文件实现所有的功能。复杂一点的方法:采用库文件的形式实现。11内容简介设计目的设计内容实施方法及要求时间安排辅导12实施方法及要求每位同学都必须独立完成课程设计内容。上机考核演示所完成系统,并回答老师的问题。提交文本的课程设计报告,内容包括调试记录和程序清单(附注释)。提交时间:第4周星期五(2010.3.26)以班为单位交东五楼206室。13实施方法及要求(续)•支持借鉴和学习已有的优秀知识!•反对全盘拷贝,不求甚解!•吸收和消化他人经验,做自己的课程设计!14内容简介设计目的设计内容实施方法及要求时间安排辅导15课程设计时间:第一周、第二周答疑:lslyx@hust.edu.cn考核现场考查时间:第二周周四、五全天,南一楼804时间安排16联络方式办公室电话:8754192487557047-----800817内容简介设计目的设计内容实施方法及要求时间安排辅导18课程设计辅导Linux系统的相关知识以RedhatLinux9.0为例进程并发添加1个系统调用添加设备驱动程序/proc文件分析19Linux系统的相关知识Linux版本•Linux通过简单的编号来区别内核的稳定版和开发版。每个版本用三个数字描述,由圆点分隔。前两个数表示版本号,第三个数表示发布号,如2.4.20。•如果第二个数为偶数,则表示稳定的内核;否则,表示开发中的内核。•稳定版的发布主要用来纠正用户所报告的错误,但实现内核的主要算法和数据结构基本不变。然而,开发版本间可能存在很大的差异。20Linux系统的常用目录文件目录结构——树型结构常用目录有:/devLinux的所有设备文件,如/dev/hda代表第一个物理IDE硬盘。/etc系统管理所需要的配置文件和子目录。/lib系统最基本的动态链接共享库,几乎所有的应用程序都需要用到这些共享库。21Linux系统的常用目录(续)/usr应用程序和文件几乎都存放在这个目录下。其中包含以下子目录:/usr/include开发和编译应用程序所需的头文件/usr/lib常用的动态链接共享库和静态档案库/usr/local一般用户的目录,在这里安装软件最适合/usr/man帮助文档的存放目录/usr/srcLinux的源代码目录22Linux系统的核心源码Linux核心源代码位于/usr/src/linux下:archCPU类型相关的核心代码。每一个子目录代表一种CPU类型,例如i386就是关于IntelCPU及与之相兼容的体系结构的子目录;drivers所有的设备驱动程序;每种驱动程序又各占用一个子目录,如/block下为块设备驱动程序include编译核心所需要的大部分头文件。与平台无关的头文件在include/linux子目录下,与IntelCPU相关的头文件在include/asm-i386子目录下;23Linux系统的核心源码(续)Linux核心源代码还包括:Init包含核心的初始化代码,包含两个文件main.c和version.c,这是研究核心如何工作的一个非常好的起点;24Linux系统的核心源码(续)mm:所有独立于CPU体系结构的内存管理代码,如页式存储管理中内存的分配和释放等,与体系结构相关的内存管理代码则位于arch/*/mm/下;kernel:主要的核心代码,此目录下的文件实现了大多数Linux系统的内核函数,其中最重要的文件当属进程调度sched.c,同样,和体系结构相关的代码在arch/*/kernel中。25课程设计辅导Linux系统的相关知识以RedhatLinux9.0为例进程并发添加系统调用添加设备驱动程序/proc文件分析26进程并发pid=fork():创建子进程。返回值:0从子进程返回,0从父进程返回exit进程自我终止,进入僵死状态,仍然保留ask_struct结构。wait()等待进程终止(由父进程调用)exec()执行一个可执行程序(文件)27课程设计辅导Linux系统的相关知识以RedhatLinux9.0为例进程并发添加系统调用添加设备驱动程序/proc文件分析28添加系统调用Linux系统调用机制Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。系统调用与普通函数调用的区别系统调用核心态操作系统核心提供普通的函数调用用户态函数库或用户自己提供29添加系统调用(续)Linux系统调用机制int0x80使用寄存器中适当的值跳转到内核中事先定义好的代码中执行:跳转到系统调用的总入口system_call,检查系统调用号,再查找系统调用表sys_call_table,调用内核函数,最后返回。系统调用是靠一些宏,一张系统调用表,一个系统调用入口来完成的。30添加系统调用(续)步骤_1添加源代码–编写添加到内核中的源程序,函数名以sys_开头。–如:mycall(intnum),在/usr/src/linux/kernel/sys.c文件中添加如下代码:asmlinkageintsys_mycall(intnumber){returnnumber;//该系统调用仅返回一个整型值}31添加系统调用(续)步骤_2连接新的系统调用使内核的其余部分知道该系统调用的存在。为此,需编辑两个文件:/usr/src/linux/include/asm-i386/unistd.h——系统调用清单(为每个系统调用分配唯一号码)#define_NR_namennn这里,name:系统调用名;nnn:系统调用对应的号码,不能与内核自身的系统调用号相同。/usr/src/linux/arch/i386/kernel/entry.S——对sys_call_table[]进行初始化(增加新的内核函数的指针).longSYMBOL_NAME(sys_mycall)32添加系统调用(续)步骤_3重建Linux内核以root身份进入/usr/src/linux目录,重建内核#makeconfig//基于文本的传统配置界面#makedep//检验内核源代码文件的依赖性和完整性#makeclean//清除以前编译的目标文件#makebzImage//编译内核,也可采用makezImage编译生成的内核文件为/usr/src/linux/arch/i386/boot/bzImage33添加系统调用(续)步骤_4重启内核将/usr/src/linux/arch/i386/boot/bzImage拷贝到/boot/bzImage配置启动文件若采用lilo,修改/etc/lilo.conf,添加新的引导内核image=/boot/bzImage//上面编译生成的内核映象label=Linuxtest//给该系统取个名字root=/dev/hda5//根目录所在的分区,可用命令df查看read-only若采用grub,修改/etc/grub.conf,添加新的引导内核titleLinuxtestroot(hd0,4)kernel/boot/bzImageroroot=/dev/hda5initrd/boot/initrd-2.4.18-3.img重启后,出现Linuxtest选项,选择它进入新的内核34添加系统调用(续)步骤_5使用新的系统调用应用程序app.c中调用新添加的系统调用mycall:宏指令说明:_syscalln(parameters):n表示系统调用所需参数,parameters为参数。如上面的宏中,第一个参数int表示返回值类型,第二个参数mycall为函数名。第三个和第四个分别用来指定参数的类型和名称。编译gcc–oappapp.cintmain(intargv,char*argc[]){inta=mycall(100);printf(“%d\n”,a);return0;}#includestdio.h#include/usr/src/linux-2.4/include/asm/unistd.h#includeerrno.h_syscall1(int,mycall,int,ret)35课程设计辅导Linux系统的相关知识以RedhatLinux9.0为例进程并发添加系统调用添加设备驱动程序/proc文件分析36添加设备驱动程序内核模块LKMLoadableKernelModulesLinux核心是一种monolithic类型的内核,即单一的大核心。linux内核是一个整体结构,因此向内核添加或者删除某些功能,都十分困难。为了解决这个问题,引入了模块机制,从而可以动态的在内核中添加或者删除模块。37添加设备驱动程序(续)模块的实现机制模块初始化intinit_module(){};模块卸载intcleanup_module(){};操作unsignedlongsys_create_module(char*name,unsignedlongsize);//重新分配内存intsys_delete_module(char*name);//卸载intsys_query_module(constchar*name,intwhich,void*buf,size_tbufsize,size_t*ret);//查询头文件:/usr/scr/linux/include/linux/module.h38添加设备驱动程序(续)模块的实现机制模块加入:insmodmodulename.o完成:加载目标文件调用create_module重新分配内存内核符号用get_kernel_syms解析未解析的引用调用init_module初始化LKM-执行init_module(void)函数39添加设备驱动程序(续)查看模块:lsmod结果:ModulePageUsedbymodulename1(内存信息)0(使用次数)删除模块:rmmodmodulename40添加设备驱动程序(续)模块编程实例hello.c源码编译gcc–DMODULE–D_KERNEL_-I/usr/src/linux_2.4.20-8/include-chello.cprintk(helloworld!\n');printk(Ihaveruninginakernelmod!\n);return0;}voidcleanup_module()/*模块卸载*/{printk(Iwillshutdownmyselfinkernelmod!\n);}#includelinux/kernerl.h#includelinux/module.h/*处理版本问题CONFIG_MODVERSIONS*/#ifCONFIG_MODVERSIONS==1#defineMODVERSIONS#includelinux/version.h#endifintinit_module()/*模块初始化*/{41添加设备驱动程序(续)Linux支持的设备类型字符设备——c存取时没有缓存;对字

1 / 60
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功