多级目录管理及linux代码分析 操作系统课程设计报告_(6)_第1页
多级目录管理及linux代码分析 操作系统课程设计报告_(6)_第2页
多级目录管理及linux代码分析 操作系统课程设计报告_(6)_第3页
多级目录管理及linux代码分析 操作系统课程设计报告_(6)_第4页
多级目录管理及linux代码分析 操作系统课程设计报告_(6)_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

哈尔滨理工大学课程设计(计算机操作系统)题目多级目录管理及LINUX代码分析班级姓名指导教师系主任2014年03月01日目录1多级目录管理课程设计111题目分析112数据结构113流程图114实现技术215设计结论和心得22LINUX代码分析321时钟和定时器中断422TVECS结构及其实现423间隔定时器ITIMER424函数调用关系图4哈尔滨理工大学课程设计报告01多级目录管理课程设计11题目分析在现代计算机系统中,都要存储大量的文件,为了能对这些文件实施有效的管理,必须对他们加以妥善组织,这主要是通过文件目录来实现的。对于大型文件系统,通常采用三级或三级以上的目录结构,以提高对目录的检索速度和文件系统的性能。多级文件目录又成为树型目录结构,主目录在这里被成为根目录,把数据文件成为树叶,其他的目录均作为树的结点。本课程设计要求设计一个基于多级文件目录的文件管理系统。通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。主要要求有1在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多级文件目录的文件管理系统;2文件物理结构可采用显式链接或其他方法;3文件目录结构采用多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护;4设计一个较实用的用户界面,方便用户使用。哈尔滨理工大学课程设计报告112数据结构1文件夹数据结构体TYPEDEFSTRUCTMFD/主文件目录CHARUSERNAME100CHARPASSWORD100FILEFP/文件目录指针MFD2用户文件数据结构体TYPEDEFSTRUCTUFD/用户文件目录CHARFILENAME256CHARPROTECT/保护码哈尔滨理工大学课程设计报告2INTLENGTH/文件长度UFD3功能实现命令数据结构体TYPEDEFSTRUCTCOMM/命令串CHARSTRING256/用户命令串STRUCTCOMMNEXT/后继指针指向命令各参数所在的结点COMMMFDMAINFDN/主文件目录数组UFDUSERFDM/用户文件目录数组OFDOPENFDL/打开文件目录数组COMMCOMMAND/命令串指针INTNEXT哈尔滨理工大学课程设计报告3DISK哈尔滨理工大学课程设计报告413流程图哈尔滨理工大学课程设计报告5开始输入用户判断是否存在YESNO删除文件创建子目录改变子目录列出子目录关闭文件打开文件创建文件读文件写文件是否退出结束NOYES哈尔滨理工大学课程设计报告6图1程序流程图14实现技术1运行后主界面显示图2主界面哈尔滨理工大学课程设计报告72输入LOGIN命令用户登陆,当用户账号不存在时,即可创建图3创建用户3创建用户下文件功能实现哈尔滨理工大学课程设计报告8图4创建用户4打开文件OPEN命令功能的实现哈尔滨理工大学课程设计报告9图5打开文件5读文件READ命令功能实现图6读文件6写文件WRITE命令功能实现,及对内容中添加实现哈尔滨理工大学课程设计报告10图7写文件8退出文件LOGOUT操作图8退出文件哈尔滨理工大学课程设计报告1115设计结论和心得这次操作系统课程设计,在编写过程中,遇到很多难题,特别是在操作系统实验中不曾注意到的问题,也有许多新的问题,在实际反复调试运行中,不断加深了对操作系统的理解,也很大地程度上提高了编程的能力,由于对重要概念的把握程度还不够深入,在实际理解编写时遇到很多不该发生的问题。不过,都很好的解决并牢牢地掌握住了。通过做多级目录文件系统,我知道了多级目录文件系统的工作原理,在打开文件时系统是如何进行操作的,并加深了理解。希望在以后的学习中,继续保持这份昂扬的斗志,继续努力学习计算机方面的知识,永不懈怠。通过这次课程设计,不仅让我了解了多级目录文件系统,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原由的基础上我进行了改正,我最后还是调试成功了,虽然还是经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。盲目真的不应该再在我们新一代的大学生身上出现了,我们应该认真找到自己的缺点并且及时改正。在这里,我如果不说感谢的话,不知道要说些什么好;首先感谢学校和父母,然后更重要的是感谢老师的教导。“活到老,学到老”,这也是我整个学习过程中的一次经验、一次总结,我相信它肯定哈尔滨理工大学课程设计报告12会给我今后的学习有所启示和指导作用。附录源程序代码INCLUDEINCLUDE/里面有CLRSCR清屏函数INCLUDEINCLUDEINCLUDE/内存分配函数INCLUDEINCLUDEDEFINEN30/用户数DEFINEM20/一个用户可保存M个文件DEFINEL5/用户只能一次打开L个文件TYPEDEFSTRUCTMFD/主文件目录CHARUSERNAME100CHARPASSWORD100哈尔滨理工大学课程设计报告13FILEFP/文件目录指针MFDTYPEDEFSTRUCTUFD/用户文件目录CHARFILENAME256CHARPROTECT/保护码INTLENGTH/文件长度UFDTYPEDEFSTRUCTOFD/打开文件目录CHARFILENAME256CHAROPENCODE/打开保护码INTFP/读写指针OFDTYPEDEFSTRUCTCOMM/命令串CHARSTRING256/用户命令串STRUCTCOMMNEXT/后继指针指向命令各参数所在的结点COMMMFDMAINFDN/主文件目录数组UFDUSERFDM/用户文件目录数组哈尔滨理工大学课程设计报告14OFDOPENFDL/打开文件目录数组COMMCOMMAND/命令串指针CHARUSERNAME100INTUSERNUM,SAVENUM,OPENNUMINTWORKFILEVOIDINIT/初始化主文件目录数组VOIDINIT_UFDCHARUSERNAME/初始化用户文件目录VOIDMESGCHARSTR/输出函数CHARGETUSER/设置用户函数声明CHARGETPASS/设置口令函数声明COMMREADCOMMAND/读命令串函数声明VOIDLOGIN/用户登录VOIDSETPASS/设置口令VOIDCREATE/创建用户文件VOIDMYDELETE/删除VOIDMYREAD/读VOIDMYOPEN/打开VOIDMYCLOSE/关闭哈尔滨理工大学课程设计报告15VOIDMYWRITE/写VOIDHELP/帮助VOIDMAININITPRINTF“NTT“PRINTF“NTT多级文件目录的文件管理系统“PRINTF“NTT“PRINTF“NTT选择命令“PRINTF“NTTLOGINSETPASSCREATE“PRINTF“NTTOPENREADWRITEDELETE“PRINTF“NTTHELPEXITCOPYRENAME“PRINTF“NTT首次使用请输入HELP命令请求帮助“PRINTF“NTT使用中欢迎以HELP请求帮助“WHILE1READCOMMANDIFSTRCMPCOMMANDSTRING,“CREATE“0CREATEELSEIFSTRCMPCOMMANDSTRING,“DELETE“0哈尔滨理工大学课程设计报告16MYDELETEELSEIFSTRCMPCOMMANDSTRING,“OPEN“0MYOPENELSEIFSTRCMPCOMMANDSTRING,“CLOSE“0MYCLOSEELSEIFSTRCMPCOMMANDSTRING,“READ“0MYREADELSEIFSTRCMPCOMMANDSTRING,“WRITE“0MYWRITEELSEIFSTRCMPCOMMANDSTRING,“LOGIN“0LOGINELSEIFSTRCMPCOMMANDSTRING,“SETPASS“0SETPASSELSEIFSTRCMPCOMMANDSTRING,“HELP“0HELPELSEIFSTRCMPCOMMANDSTRING,“EXIT“0BREAK哈尔滨理工大学课程设计报告17ELSEMESG“BADCOMMAND“VOIDMESGCHARSTRPRINTF“NSN“,STRVOIDINIT/初始化主文件目录数组FILEFP/文件指针CHARTEMPNAME20,TEMPPASS20USERNUM0/全局变量初始化SAVENUM0OPENNUM0STRCPYUSERNAME,“/用户使用时,建立一个MAINFILETXT文件,包括每个用户的用户名和口令/然后,才能运行此程序IFFPFOPEN“MAINFILETXT“,“R“NULL/以读方式打开文件MAINFILETXT哈尔滨理工大学课程设计报告18WHILEFEOFFP/若不是文件尾STRCPYTEMPNAME,“/清空数组操作FGETSTEMPNAME,20,FP/读用户名IFSTRCMPTEMPNAME,“0FGETSTEMPPASS,20,FPTEMPNAMESTRLENTEMPNAME10/设置串结束符TEMPPASSSTRLENTEMPPASS10STRCPYMAINFDUSERNUMUSERNAME,TEMPNAME/生成MAINFD数组STRCPYMAINFDUSERNUMPASSWORD,TEMPPASS/生成USERFD数组USERNUM/生成USERNUM的值IFUSERNUMNBREAKFCLOSEFPVOIDINIT_UFDCHARUSERNAME/初始化用户文件目录哈尔滨理工大学课程设计报告19FILEFPCHARTEMPFILE100,TEMPPROTINTTEMPLENGTHSAVENUM0OPENNUM0WORKFILE1IFFPFOPENUSERNAME,“R“NULLWHILEFEOFFPSTRCPYTEMPFILE,“FGETSTEMPFILE,50,FPIFSTRCMPTEMPFILE,“0FSCANFFP,“C“,FSCANFFP,“D“,TEMPFILESTRLENTEMPFILE10STRCPYUSERFDSAVENUMFILENAME,TEMPFILE/文件名USERFDSAVENUMPROTECTTEMPPROT/保护码USERFDSAVENUMLENGTHTEMPLENGTH/文件长度哈尔滨理工大学课程设计报告20SAVENUMFGETSTEMPFILE,50,FPCHARGETUSER/设置用户函数声明CHARUSERNAME20CHARTEMPINTIUSERNAME00FORI0I“GETSLINE/输入一个命令串FORI0I0/对命令行中的子串进行处理哈尔滨理工大学课程设计报告24TEMPEND0NEWPCOMMMALLOCSIZEOFCOMMSTRCPYNEWPSTRING,TEMPNEWPNEXTNULLIFCOMMANDNULLCOMMANDNEWP/把各子串链成一个链表ELSEPCOMMANDWHILEPNEXTNULLPPNEXTPNEXTNEWPPCOMMANDRETURNCOMMAND哈尔滨理工大学课程设计报告25VOIDLOGIN/用户注册FILEFPINTICHARPASSWORD20,CONFIRM20,TEMPNAME20IFCOMMANDNEXTNULLPRINTF“NUSERNAME“STRCPYTEMPNAME,GETUSER/输入用户名并且返回之ELSEIFCOMMANDNEXTNEXTNULLMESG“TOOMANYPARAMETERS“RETURNELSESTRCPYTEMPNAME,COMMANDNEXTSTRINGFORI0IUSERNUM/新用户哈尔滨理工大学课程设计报告26PRINTF“N新用户账号,输入你的密码两次“PRINTF“N密码“STRCPYPASSWORD,GETPASS/输入口令并且返回之PRINTF“N密码“STRCPYCONFIRM,GETPASS/第二次输入口令IFSTRCMPPASSWORD,CONFIRM0/两次输入的口令是否相同的处理情况IFUSERNUMN/用户数不能超过NMESG“创建新账号错误用户账号字符超过限制N登陆失败“ELSESTRCPYMAINFDUSERNUMUSERNAME,TEMPNAME/把新用户和口令填入MAINFD中STRCPYMAINFDUSERNUMPASSWORD,PASSWORDUSERNUMSTRCPYUSERNAME,TEMPNAMEMESG“创建新用户N登陆成功恭喜“INIT_UFDUSERNAME/初始化用户文件目录FPFOPEN“MAINFILETXT“,“W“/把新用户填入MAINFILETXT文件中FORI0INEXTNULLMESG“TOOFEWPARAMETERS“ELSE/存在2个或3个参数的处理STRCPYTEMPFILE,“TEMPCODERIFSTRCMPCOMMANDNEXTSTRING,“/R“0TEMPCODERTYPE1ELSEIFSTRCMPCOMMANDNEXTSTRING,“/W“0TEMPCODEWTYPE1哈尔滨理工大学课程设计报告32ELSEIFSTRCMPCOMMANDNEXTSTRING,“/D“0TEMPCODEDTYPE1ELSEIFCOMMANDNEXTSTRING0/MESG“ERROR/R/W/DREQUEST“ELSEIFCOMMANDNEXTNEXTNULLMESG“TOOMANYPARAMETERS“ELSESTRCPYTEMPFILE,COMMANDNEXTSTRINGIFTYPE1/三个参数的情况补充IFCOMMANDNEXTNEXTNULLIFCOMMANDNEXTNEXTNEXTNULLMESG“TOOMANYPARAMETERS“ELSESTRCPYTEMPFILE,COMMANDNEXTNEXTSTRINGELSEMESG“TOOFEWPARAMETERS“IFSTRCMPTEMPFILE,“0哈尔滨理工大学课程设计报告33FORI0ISAVENUMMESG“FILENOTEXISTED“ELSE/文件存在的情况FORI0IL/打开的文件已经占满了5个名额MESG“ERRORCANNOTOPENFILENIMBEROFOPENEDFILESLIMITED“ELSE/打开处理STRCPYOPENFDOPENNUMFILENAME,TEMPFILEOPENFDOPENNUMOPENCODETEMPCODEWORKFILEOPENNUMOPENNUMMESG“FILEOPENSUCCESS“VOIDMYCLOSE/关闭文件INTI,JCHARTEMPFILE100IFSTRCMPUSERNAME,“0哈尔滨理工大学课程设计报告35MESG“NOUSERLOGIN“ELSEIFCOMMANDNEXTNULLMESG“TOOFEWPARAMETERS“ELSEIFCOMMANDNEXTNEXTNULLMESG“TOOMANYPARAMETERS“ELSESTRCPYTEMPFILE,COMMANDNEXTSTRINGFORI0ISAVENUM/文件不存在MESG“文件不存在“ELSEFORJ0JOPENNUM/文件存在了但是没有打开MESG“文件存在了但是没有打开“ELSE/文件存在并且打开STRCPYOPENFDJFILENAME,“OPENFDJOPENCODEOPENNUMMESG“文件关闭成功“VOIDMYDELETE/删除文件INTI,JINTTEMPSAVE/用于确定被删除文件在数组USERFDM中的位置CHARTEMPFILE100FILEFPIFSTRCMPUSERNAME,“0哈尔滨理工大学课程设计报告37MESG“没有用户登陆“ELSEIFCOMMANDNEXTNULLMESG“TOOFEWPARAMETERS“ELSEIFCOMMANDNEXTNEXTNULLMESG“太多参数导致错误“ELSESTRCPYTEMPFILE,COMMANDNEXTSTRINGFORI0ISAVENUM/文件不存在MESG“THEFILEDONOTEXISTED“ELSEFORJ0JNEXTNULL哈尔滨理工大学课程设计报告40MESG“参数太少导致错误“ELSEIFCOMMANDNEXTNEXTNULLMESG“参数太多导致错误“ELSESTRCPYTEMPFILE,COMMANDNEXTSTRINGFORI0ISAVENUMMESG“文件不存在“ELSETEMPSAVEIFORI0IOPENNUMMESG“文件没有打开“ELSE哈尔滨理工大学课程设计报告41IFUSERFDTEMPSAVELENGTHNEXTNULLMESG“参数太少导致错误“ELSEIFCOMMANDNEXTNEXTNULLMESG“参数太多导致错误“ELSESTRCPYTEMPFILE,COMMANDNEXTSTRINGFORI0ISAVENUMMESG“文件不存在“ELSETEMPSAVEIFORI0IOPENNUMMESG“文件没有打开“ELSEIFUSERFDTEMPSAVELENGTH“,“命令格式SETPASS“,“命令格式CREATE“,“命令格式OPEN/R|/W|/D“,“命令格式READ“,“命令格式WRITE“,“命令格式TDELETE“,“命令格式HELP“,“命令格式EXIT“,“命令格式COPY“,“命令格式RENAME“STATICCHARDETAIL“解说用户进入多用户多级目录文件系统“,“解说修改用户密码“,“解说用户退出多用户多级目录文件系统“,哈尔滨理工大学课程设计报告45“解说创建新文件“,“解说/R只读DEFLAUTNT/W读和修改NT/D读、修改和删除“,“解说读文件“,“解说修改新文件“,“解说删除新文件“,“解说/U列出用户账号NT/O列出打开文件NT/F列出用户文件DEFLAUT“,“解说列出命令详细格式和解说NTDEFLAUT列出命令“,“解说退出文件系统“,“解说复制一个文件到另一个文件“,“解说修改文件名“INTHELPNUM13INTIIFCOMMANDNEXTNULLMESGCMDHLP9MESGDETAIL9MESG“步骤1用LOGIN命令登陆“PRINTF“T输入用户名是旧用户就直接登陆,否则就创建新用户“哈尔滨理工大学课程设计报告46MESG“步骤2打开OPEN命令)文件再读(READ命令),写(WRITE命令),删除(DELETE命令)“PRINTF“你可以打开一个或多个文件,一个命令能打开一个文件“MESG“步骤3读(READ命令),写(WRITE命令)或删除(DELETE命令)一些文件“PRINTF“你可以操作打开文件中的一个,一个命令能操作一个文件“MESG“步骤4关闭(CLOSE命令)打开文件“PRINTF“你能关闭(CLOSE命令)一个打开的文件,一个命令能打开一个文件“MESG“步骤5用户退出关闭所有用户打开的文件“PRINTF“N可输入的命令清单“FORI0INEXTNEXTNULLMESG“参数太多“ELSEFORI0INEXTSTRING,CMDI0BREAKIFIHELPNUMMESG“这命令不存在“ELSEMESGCMDHLPIMESGDETAILI哈尔滨理工大学课程设计报告482LINUX代码分析操作系统需要一种机制,使它能够在未来某个相当精确的时间里调度激活某项活动,这种机制称之为定时器(TIMER)。任何希望支持操作系统的微处理器都必须有一个能够周期中断处理器的可编程的间隔计时器ITIMER。这种周期的中断就象节拍一样,组织起系统活动的大合唱。分析了SYS_GETITIMER、SYS_SETITIMER和SYS_ALARM三个系统调用并了解了定时器的工作机制。21时钟和定时器中断系统启动核心时,调用START_KERNAL继续各方面的初始化,在这之前,各种中断都被禁止,只有在完成必要的初始化后,直到执行完KMALLOC_INIT后,才允许中断(INITMAINC)。与时钟中断有关的部分初始化如下(1)调用TRAP_INIT设置各种TRAP入口,如SYSTEM_CALL、GDTENTRY、LDTENTRY、CALL哈尔滨理工大学课程设计报告49GATE等。其中,017为各种错误入口,1847保留。(2)调用INIT_IRQ函数设置核心系统的时钟周期为10MS,即100HZ,它是以后按照轮转法进行CPU调度时所依照的基准时钟周期。每10MS产生的时钟中断信号直接输入到第一块8259A的INT0(即IRQ0)。初始化中断矢量表中从0X20起的17个中断矢量,用BAD_IRQ_INTERRUPT函数的地址(为中断号)填写。(3)调用SCHED_INIT函数,设置启动第一个进程INIT_TASK。设置用于管理BOTTOM_HALF机制的数据结构BH_BASE,规定三类事件的中断处理函数,即时钟TIMER_BH、设备TQUEUE_BH和IMMEDIATE_BH。(4)调用TIME_INIT函数,首先读取当时的CMOS时间,最后调用SETUP_X86_IRQ0,/中断服务函数入口/UNSIGNEDLONGFLAGS/服务允中与否标记/UNSIGNEDLONGMASKCONSTCHARNAMEVOIDDEV_IDSTRUCTIRQACTIONNEXT其中,若FLAGSA_INTERRUPT,则中断矢量改为FAST_IRQ_INTERRUPT,在执行中断服务的过程中不允许出现中断,若为其它标记,则中断矢量为IRQ_INTERRUPT,在执行中断服务的哈尔滨理工大学课程设计报告51过程中,允许出现中断。IRQ_ACTION的定义与初始化如下STATICVOIDINTERRUPT17VOIDIRQ_INTERRUPTSTATICVOIDFAST_INTERRUPT16VOIDFAST_IRQ_INTERRUPTSTATICVOIDBAD_INTERRUPT16VOIDBAD_IRQ_INTERRUPT以上为中断号STATICSTRUCTIRQACTIONIRQ_ACTION16NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULLIRQ_ACTION是一个全局数组,每个元素指向一个IRQ队列,共16个IRQ队列,时钟中断请哈尔滨理工大学课程设计报告52求队列在第一个队列,即IRQ_ACTION0。当每个中断请求到来时,都调用SETUP_X86_IRQ把该请求挂到相应的队列的后面。以后,系统每10MS产生一次时钟中断信号,该信号直接输入到第一块8259A的INT0(即IRQ0)。CPU根据中断矢量表和中断源,找到中断矢量函数入口IRQ0_INTERRUPT(程序运行过程中允许中断)或者FAST_IRQ0_INTERRUPT(程序运行过程中不允许中断)或者BAD_IRQ0_INTERRUPT(不执行任何动作,直接返回),这些函数由宏BUILD_TIMER_IRQ(CHIP,NR,MASK)展开定义。宏BUILD_TIMER_IRQ(CHIP,NR,MASK)的定义如下DEFINEBUILD_TIMER_IRQCHIP,NR,MASKASMLINKAGEVOIDIRQ_NAMENRASMLINKAGEVOIDFAST_IRQ_NAMENRASMLINKAGEVOIDBAD_IRQ_NAMENR_ASM_哈尔滨理工大学课程设计报告53“N“_ALIGN_STR“N“SYMBOL_NAME_STRFAST_IRQNR“_INTERRUPTNT“SYMBOL_NAME_STRBAD_IRQNR“_INTERRUPTNT“SYMBOL_NAME_STRIRQNR“_INTERRUPTNT“PUSHL“NR“2NT“SAVE_ALLENTER_KERNELACK_CHIPMASK,NR其中NR为中断请求类型,取值015。在IRQC中通过语句BUILD_TIMER_IRQFIRST,0,0X01调用该宏,在执行宏的过程中处理时钟中断响应程序DO_IRQ。函数DO_IRQ的第一个参数是中断请求队列序号,时钟中断请求传进来的该参数是0。于是程序根据参数0找到请求队列IRQ_ACTION0,逐个处理该队列上HANDLER所指的时钟中断请求的服务函数。由于已经指定时钟中断请求的服务函数是TIMER_INTERRUPT,在函数TIMER_INTERRUPT中,立即哈尔滨理工大学课程设计报告55调用DO_TIMER函数。函数DO_TIMER把JIFFIES和LOST_TICKS加1,接着就执行MARK_BHTIMER_BH函数,把BOTTOM_HALF中时钟队列对应的位置位,表示该队列处于激活状态。在做完这些动作后,程序从函数DO_IRQ中返回,继续执行以后的汇编代码。于是,程序在执行语句JMPRET_FROM_SYS_CALL后,跳到指定的位置处继续执行。代码段JMPRET_FROM_SYS_CALL及其相关的代码段如下ALIGNGLOBLRET_FROM_SYS_CALLRET_FROM_SYS_CALLCMPL0,SYMBOL_NAMEINTR_COUNTJNE2F9MOVLSYMBOL_NAMEBH_MASK,EAX哈尔滨理工大学课程设计报告56ANDLSYMBOL_NAMEBH_ACTIVE,EAXJNEHANDLE_BOTTOM_HALFIFDEF_SMP_CMPBNO_PROC_ID,SYMBOL_NAMESAVED_ACTIVE_KERNEL_PROCESSORJNE2FENDIFMOVLEFLAGSESP,EAXCHECKVM86FLAGCS/SSARETESTLVM_MASK,EAXDIFFERENTTHENJNE1FCMPWKERNEL_CS,CSESPWASOLDCODESEGMENTSUPERVISORJE2F1STI哈尔滨理工大学课程设计报告57ORLIF_MASK,EAXTHESEJUSTTRYTOMAKESUREANDLNT_MASK,EAXTHEPROGRAMDOESNTDOANYTHINGMOVLEAX,EFLAGSESPSTUPIDCMPL0,SYMBOL_NAMENEED_RESCHEDJNERESCHEDULEIFDEF_SMP_GET_PROCESSOR_OFFSETEAXMOVLSYMBOL_NAMECURRENT_SET,EAX,EAXELSEMOVLSYMBOL_NAMECURRENT_SET,EAXENDIFCMPLSYMBOL_NAMETASK,EAXTASK0CANNOTHAVESIGNALS哈尔滨理工大学课程设计报告58JE2FMOVLBLOCKEDEAX,ECXMOVLECX,EBXSAVEBLOCKEDINEBXFORSIGNALHANDLINGNOTLECXANDLSIGNALEAX,ECXJNESIGNAL_RETURN2RESTORE_ALLALIGNSIGNAL_RETURNMOVLESP,ECXPUSHLECXTESTLVM_MASK,EFLAGSECX哈尔滨理工大学课程设计报告59JNEV86_SIGNAL_RETURNPUSHLEBXCALLSYMBOL_NAMEDO_SIGNALPOPLEBXPOPLEBXRESTORE_ALLALIGNV86_SIGNAL_RETURNCALLSYMBOL_NAMESAVE_V86_STATEMOVLEAX,ESPPUSHLEAXPUSHLEBX哈尔滨理工大学课程设计报告60CALLSYMBOL_NAMEDO_SIGNALPOPLEBXPOPLEBXRESTORE_ALLHANDLE_BOTTOM_HALFINCLSYMBOL_NAMEINTR_COUNTCALLSYMBOL_NAMEDO_BOTTOM_HALFDECLSYMBOL_NAMEINTR_COUNTJMP9FALIGNRESCHEDULEPUSHLRET_FROM_SYS_CALL哈尔滨理工大学课程设计报告61JMPSYMBOL_NAMESCHEDULETEST上述汇编代码用流程图表示如下哈尔滨理工大学课程设计报告62哈尔滨理工大学课程设计报告63另外,一些与时钟中断及BOTTOMHALF机制有关的数据结构介绍如下DEFINEHZ100UNSIGNEDLONGVOLATILEJIFFIES0系统每隔10MS自动把它加1,它是核心系统计时的单位。ENUMTIMER_BH0,CONSOLE_BH,TQUEUE_BH,DIGI_BH,SERIAL_BH,RISCOM8_BH,SPECIALIX_BH,哈尔滨理工大学课程设计报告64BAYCOM_BH,NET_BH,IMMEDIATE_BH,KEYBOARD_BH,CYCLADES_BH,CM206_BH现在只定义了13个BOTTOMHALF队列,将来可扩充到32个队列。UNSIGNEDLONGINTR_COUNT0相当于信号量的作用。只有其等于0,才可以DO_BOTTOM_HALF。INTBH_MASK_COUNT32用来计算BOTTOMHALF队列被屏蔽的次数。只有某队列的BH_MASK_COUNT数为0,才能ENABLE该哈尔滨理工大学课程设计报告65队列。UNSIGNEDLONGBH_ACTIVE0BH_ACTIVE是32位长整数,每一位表示一个BOTTOMHALF队列,该位置1,表示该队列处于激活状态,随时准备在CPU认为合适的时候执行该队列的服务,置0则相反。UNSIGNEDLONGBH_MASK0BH_MASK也是32位长整数,每一位对应一个BOTTOMHALF队列,该位置1,表示该队列可用,并把处理函数的入口地址赋给BH_BASE,置0则相反。VOIDBH_BASE32VOIDBOTTOMHALF服务函数入口地址数组。定时器处理函数拥有最高的优先级,它的地址存放在BH_BASE0,总是最先执行它所指向的函数。BOTTOMHALF机制的图示如下我们注意到,在IRQ_INTERRUPT和FAST_IRQ_INTERRUPT中断函数处理返回前,都通过语句JMPRET_FROM_SYS_CALL,跳到系统调用的返回处(见IRQH),如果BOTTOMHALF队列不为空,则在那里哈尔滨理工大学课程设计报告66做类似IFBH_ACTIVEDO_BOTTOM_HALFINTR_COUNT0该判断的汇编代码见ENTRYS的判断,调用DO_BOTTOM_HALF函数。在CPU调度时,通过SCHEDULE函数执行上述的判断,再调用DO_BOTTOM_HALF函数。总而言之,在下列三种时机1CPU调度时2系统调用返回前3中断处理返回前哈尔滨理工大学课程设计报告67都会作判断调用DO_BOTTOM_HALF函数。DO_BOTTOM_HALF函数依次扫描32个队列,找出需要服务的队列,执行服务后把对应该队列的BH_ACTIVE的相应位置0。由于BH_ACTIVE标志中TIMER_BH对应的BIT为1,因而系统根据服务函数入口地址数组BH_BASE找到函数TIMER_BH的入口地址,并马上执行该函数,在函数TIMER_BH中,调用函数RUN_TIMER_LIST()和函数RUN_OLD_TIMERS()函数,定时执行服务。22TVECS结构及其实现有关TVECS结构的一些数据结构定义如下DEFINETVN_BITS6DEFINETVR_BITS8DEFINETVN_SIZE1TVN_BITSDEFINETVR_SIZE1TVR_BITSDEFINETVN_MASKTVN_SIZE1哈尔滨理工大学课程设计报告68DEFINETVR_MASKTVR_SIZE1D

温馨提示

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

评论

0/150

提交评论