欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    操作系统课程设计 indoe.c流程及代码分析.doc

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

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

    操作系统课程设计 indoe.c流程及代码分析.doc

    1、1总体概述22模块整体功能介绍及主要目标221 模块整体功能222 主要目标33头文件的分析331 头文件kernel.h332 头文件sched.h433 头文件system.h434 头文件fs.h44数据结构的分析45函数的分析651 read_inode()函数分析652 write_inode()函数分析753 sleep_on()函数分析754 wait_on_inode()函数分析855 lock_inode()函数分析956 unlock_inode()函数分析957 invalidate_inodes()函数分析1058 sync_inodes(void)函数分析1159 _

    2、bmap()函数分析11510 bmap()函数分析15511 iput()函数分析15512 get_empty_inode()函数分析17513 get_pipe_inode()函数分析18514 create_block()函数分析18515 iget()函数分析196分析体会及自己所做亮点工作217参考文献23第23页1总体概述实验名称:Linux0.11文件系统源代码分析之I节点管理源代码分析;源代码在源程序中的具体位置:linux/fs/inode.c(电子书Linux内核0。11完全注释赵炯编著的451页)。实验要求:对该源代码进行分析的主要任务是对重要的头文件进行分析、结合代码

    3、对实现所用的主要数据结构进行分析、结合代码对主要函数功能进行分析,并画出函数间调用关系结构图或程序流程图。实验预期结果:从形式上来看,程序主要是头文件、数据结构和函数构成,从思路上来看,程序是由数据结构和算法构成,但是现在Linux操作系统源代码,已经给了我们,而且别人也分析的特别的详细了。作为初学者,没有什么经验,我想能把它看懂就不错了,所以最重要的是对程序的各个函数进行分析,画出流程图(主要是通过流程图来分析),在画流程图的过程中,仔细体会每行代码的作用和思路,从而最终看懂整个inode.c程序。2模块整体功能介绍及主要目标21模块整体功能inode.c程序主要涉及文件系统i节点信息的访问

    4、和管理。每个文件的创建都会有一个i节点,它包括该文件的所有信息,本程序就是对创建好的文件的i节点进行管理。该程序主要包括处理i节点的iget()、iput()、bmap(),以及其他一些辅助函数。iput()函数的功能与iget()函数正好相反,主要把i节点引用计数值递减1,要是在某一时刻进程不需要持续使用一个i节点时就应该调用iput()函数来使i节点引用值减1,好让内核执行其他一些处理。(详细过程见iput()函数的流程图(图14);iget()函数的功能是从设备上取指定节点号的i节点,处理过程是扫描整个i节点表,来找相应的i节点,当找到后再等待解锁,这时i节点表可能会发生变化,就要再重新

    5、扫描i节点表,还要把i节点的引用计数值增1,还要判断是否是安装点,要是的话,就在超级块表中找,找到后,再写盘,再重新扫描整个i节点表。最后返回找到的i节点指针。(详细过程见iget()函数的流程图(图18)。22主要目标 主要分析inode.c程序中的处理i节点的主要处理函数,包括iget()、iput()、bmap(),以及其他一些辅助函数。结合代码对主要函数功能进行分析,并画出函数间调用关系结构图或程序流程图。3头文件的分析31 头文件kernel.hpanic(const char*str);/标准打印(显示)函数printf();/内核专用的打印信息函数,功能与printf()相同pr

    6、intk();/往tty上写指定长度的字符串。32 头文件sched.hextern void sleep_on(struct tast_struct*p);/不可中断的等待睡眠extern void interruptible_sleep_on(struct tast_struct*p);/可中断的等待睡眠extern void wake_up(struct tast_struct*p);/明确唤醒睡眠的进程。33 头文件system.h sti();/开中断嵌入汇编宏函数 cli();/关中断34 头文件 fs.hextern struct m_inode inode_tableNR_IN

    7、ODE;/定义i节点表数组(32项)extern void truncate(struct m_inode*inode);/刷新i节点信息。extern voic sync_inodes(void);/等待指定的i节点。extern void brelse(struct buffer_head*buf);/读取指定的数据块。4数据结构的分析41 struct buffer_head;/缓冲块头数据结构,在程序中常用bh来表示buffer_head类型的缩写(极为重要)(结构见图1)图1 struct buffer_head结构体42 struct d_inode;/磁盘上的索引节点(i节点)数

    8、据结构。43 struct m_inode;/在内存中的i节点结构(结构见图2)图2 struct m_inode结构体44 struct super_block;/内存中磁盘超级块结构(结构见图3)图3 struct super_block结构体45 struct d_super_block;/磁盘上超级块结构46 struct m_inode inode_tableNR_INODE=0,;/内存中I节点表5函数的分析51 read_inode()函数分析511函数头:static void read_inode(struct m_inode*inode);512主要功能:读取指定I节点信息

    9、;从设备上读取含有指定I节点信息的I节点盘块,然后复制到指定的I节点结构中。为了确定I节点所在的设备逻辑块号(或缓冲块),必须首先读取相应设备上的超级块,以获取用于计算逻辑块号的每块I节点数信息INODES_PER_BLOCK.在计算出I节点所在的逻辑块号后,就把该逻辑块读入一缓冲块中。然后把缓冲块中相应位置处的I节点内容复制到参数指定的位置处。513流程图:(见图4)锁定该I节点从设备上取得超级块否?YN提示从其他地方读入计算设备逻辑块号复制到indoe指针所指位置处Brelse(bh)unlock_inode(inode)图4 read_inode()函数流程图52 write_inode

    10、()函数分析521函数头:static void write_inode(struct m_inode*inode);522功能分析:将i节点信息写入缓冲区中。该函数把参数指定的i节点写入缓冲区相应的缓冲块中,待缓冲区刷新时会写入盘中。523流程图:(见图5)锁定该I节点lock_inode(inode)修改过或设备号0否?YN退出计算设备逻辑块号复制到逻辑块对应该I节点项位置处置缓冲区已修改标志bh-b_dirt=1内容与缓冲区一致bh-b_dirt=0Brelse(bh);unlock_inode(inode)结束图5 write_inode()函数流程图53 sleep_on()函数分析

    11、531函数头:void sleep_on(struct tast_struct*p);532功能分析:把当前任务置为不可中断的等待状态,并让睡眠队列列头指针指向当前任务,只有明确地唤醒时才会返回。该函数提供了进程与中断处理程序之间的同步机制。函数参数p是等待任务队列列头指针。指针是含有一个变量地址的变量。这里参数p使用了指针的指针形式*p,这是因为C函数参数只能传值,没有直接的方式让被调用函数改变调用该函数程序中变量的值。但是指针*p指向的目标(这里是任务结构)会改变,因此为了能修改调用该函数程序中原来就是指针变量的值,就需要传递指针*p的指针,即*P。54 wait_on_inode()函数

    12、分析541函数头:static inline void wait_on_inode(struct m_inode*inode);542函数的功能:等待指定的i节点可用;如果i节点已被锁定,则将当前任务置为不可中断的等待状态,并添加到该I 节点的等待队列i_wait中,直到该i节点解锁并明确地唤醒本任务。543程序流程图:(见图6)关中断cli()开中断sti()I节点锁定否?NYsleep_on(&inode-i_wait)结束图6 wait_on_inode()函数流程图55 lock_inode()函数分析551函数头:static inline void lock_inode(struc

    13、t m_inode*inode);552函数的功能:对指定的I节点上锁;如果I节点已被锁定(即当inode-i_lock=1),则将当前任务置为不可中断的等待状态,并添加到该I节点的等待队列i_wait中。直到该I节点解锁(inode-i_lock=0时)并明确地唤醒本任务。然后对其上锁(inode-i_lock=1)。553流程图:(见图7)关中断cli()I节点锁定否?YNsleep_on(&inode-i_wait)结束开中断sti()Inode-i_lock=1图7 lock_inode()函数流程图56 unlock_inode()函数分析561函数头:static inline v

    14、oid unlock_inode(struct m_inode*inode);562函数的功能:对指定的i节点解锁;首先使i节点的锁定标志为0(复位),并明确地唤醒(wake_up(&inode-i_wait))等待在此i节点等待队列i_wait上的所有进程。57 invalidate_inodes()函数分析571函数头:void invalidate_inodes(int dev);572函数的功能:释放设备dev在内存i节点表中的所有i节点;扫描内存中的i节点表数组,如果是指定设备使用的i节点就释放之。573流程图:(见图8)指向内存i节点表数组首项显示出错警告YNINR_INODE ?

    15、初始化i=0I节点解锁?YN是指定设备的i节点否?YI_count0?NY释放i节点(置设备号为0) I+,inode+指向下一节点N结束图8 invalidate_inodes()函数流程图58 sync_inodes(void)函数分析581函数头:void sync_inodes(voic);582函数的功能:同步所有i节点;把内存i节点表中所有i节点与设备上i节点作同步操作。583流程图:(见图9)指向内存i节点表数组首项YNIi_dirt=1;inode-i_ctime=CURRENT_TIMEi_zone7为0?Y创建时申请失败返回0退出读取设备上该i节点的一次间接块N读到否?Y取

    16、该间接块的第block项中盘块号i创建且i为 0?修改标志bh-b_dirt=1Y申请一磁盘块,并等于该新盘块号Nbrelse(bh);/释放且return I;图11 _bmap()函数中对一次间接块进行处理的流程图5933对二次间接块进行处理的过程:(见图12)YYYNYN申请一磁盘块用于存放间接信息块Inode-i_dirt=1;inode-i_ctime=CURRENT_TIMEi_zone8为0?创建时申请失败返回0退出读取设备上该i节点的一次间接块读到否?取该间接块的第block项中盘块号i创建且i为 0?修改标志bh-b_dirt=1申请一磁盘块,并等于该新盘块号brelse(b

    17、h);/释放且return I;创建且i_zone8为0?对二次间接块进行处理block-=512返回0N图12 _bmap()函数中对二次间接块进行处理510 bmap()函数分析5101函数头:int bmap(struct m_inode*inode,int block);5102函数的功能:取文件数据块block在设备上对应的逻辑块号;参数:inode-文件的内存i节点指针;block-文件中的数据块号;若操作成功则返回对应的逻辑块号,否则返回0。5103调用结构图:(见图13)调用bmap()函数_bmap()函数图13 bmap()函数调用结构图511 iput()函数分析5111

    18、函数头:void iput(struct m_inode*inode);5112功能分析:放回(放置)一个i节点(回写入设备)。该函数主要用于把i节点引用计数值递减1,并且若是管道i节点,则唤醒等待的进程。若是块设备文件i节点则刷新设备。并且若i节点的链接计数为0,则释放该i节点占用的所有磁盘逻辑块,并释放该i节点。5113流程图:(见图14)图14 iput()函数流程图512 get_empty_inode()函数分析5121函数头:struct m_inode*get_empty_inode(void);5122功能分析:从i节点表(inode_table)中获取一个空闲i节点项; 51

    19、23流程图:(见图15)last_inode指针指向i节点表第一项循环扫描整个i节点表找到空闲i节点否?N打印供调试用并停机等待解锁Yinode-i_dirt=1?Ywrite_inode(inode);wait_on_inode(inode)Ninode-i_count0?YN已找到符合要求的空闲i节点项该i节点项内容清0,引用计数为1返回i节点指针并结束图15 get_empty_inode()函数流程图513 get_pipe_inode()函数分析5131函数头:struct m_inode*get_pipe_inode(void);5132功能分析:获取管道节点。5133流程图:(见

    20、图16)扫描i节点表,寻找一个空闲i节点项引用计数置为2(读者和写者)复位管道头和尾指针YN返回NULL申请一页内存,并i_size指向该页面还有空闲内存否?N释放该i节点,并返回NULLY置节点为管道使用的标志i_pipe=1返回inode并结束get_empty_inode()找到否?图16 get_pipe_inode()函数流程图514 create_block()函数分析5141函数头:int create_block(struct m_inode*inode,int block);5142功能分析:取文件数据块block在设备上对应的逻辑块号;如果对应的逻辑块不存在就创建一块;返回

    21、设备上对应的已存在或新建的逻辑块号。参数:inode-文件的内存i节点指针;block-文件中的数据块号。5143调用结构图:(见图17)调用Create_block()函数_bmap()函数图17 create_block()函数调用结构图515 iget()函数分析5151函数头:struct m_inode*iget(int dev,int nr);5152功能分析:取得一个i节点。5153流程图:(见图18)图18 iget()函数流程图6分析体会及自己所做亮点工作经过自己几天的努力,Linux0.11文件系统源代码分析之I节点管理源代码分析inode.c,终于用自己的思路分析完了,理

    22、解透了。Inode.c程序总共有339行代码,乍一看,自己都会心烦,很难看下去,报告也无从着手来写,虽然注解非常的详细,看代码最忌讳的就是没有耐心,所以在看代码之前就必需使自己静下心来,然后根据熊老师的要求,报告的说明,想好自己的分析计划。先整体看一下程序,看它由哪些函数构成,第一遍看下来,就发现在inode.c程序中,定义了一些主要函数(如:read_inode(),write_inode(),iget(),get_pipe_inode(),get_empty_inode(),iput(),bam(),_bamp(),sync_inode(),invalidate_inodes(),unlo

    23、ck_inode(),lock_inode(),wait_inode())(看第一遍时,只看一下这些函数头),它在本程序中定义了,那么看懂这些是必需的,不过同时我也发现,在这些函数中,也调用了其他的一些函数(如:cli(),sti(),sleep_on(),wake_up(),printk(),panic(),bread()等等),而这些函数呢,在本程序中却没有定义,只是直接拿来调用它了,开始是用点糊涂,一下子间反应不过来是怎么回事,后来问了熊老师,他的讲解,让我顿间明白过来,也想起自己以前也编写过的像这种把所有的子程序,综合起来运行,那就是把一些需要共享的函数的函数头放到头文件中,当哪个子程

    24、序需要调用它们时,只需要加载相应的头文件即可。最终这些函数在头文件(第11章)都能够找到。(有注解,所以我能看的懂)。类似的道理,一些在此程序中没有定义的数据结构,在头文件中也都有定义。在最初不断地浏览整个程序的过程中,也遇到了一些问题,虽然有注解,但是注解中的有些词汇(名词),却不知道是什么意思,同时我注意到,inode.c程序只是文件系统源代码的一部分,而文件系统中的各个子程序也有交叉,所以我现在要明白,不能孤立地看这个程序,而是要是发现不懂的地方,可以到别的程序中找答案,例如:超级块:超级块中主要存放了有关整个文件系统的信息,其信息结构参见“总体功能描述”中的图9-3(电子书399页),

    25、并说明各部分的大小。在linux0.11系统中,被加载的文件系统超级块保存在超级块表(数组)supper_block中。整体思路想好后,接下来的任务就是单个的分析每个数据结构、函数,注意有些数据结构在本程序中没有定义,要到头文件中去寻找。在分析函数的时候,有了前提知识,我是直接分析源代码的结构的,只有自己不懂的时候,才会去看注解,然后基本上都是用流程图或函数间调用结构图来描述的,再加了一些说明性的文字。这样我就利用电子书上的注解分析,转换为自己的思路,这样的思维不那么呆板,而且也很有成就感。通过分析程序画出其流程图,使我必需耐心看完并分析每条语句,分析一点,就记录一点在图上,最终把整个程序分析

    26、完。冰冻之尺,非一日之寒,339行的程序分析下来,也花了我不少时间,从开始查资料到最后报告的完成,前后也有5天的时间。分析此程序,使我了解了,处理i节点的函数iget()、iput()、bmap(),以及其他一些辅助函数的具体实现过程。Iget()是指从设备上读取指定节点号nr的i节点,而iput()函数所完成的功能,正好与iget()函数相反,它主要用于把i节点引用计数值递减1,并且若是管道i节点,则唤醒等待的进程。各个函数的具体详细描述过程见此报告的正文,在此不再赘余。以上都是自己在分析inode.c程序中所得出的一点体会及一些学习方法和思考问题的方式。我自己认为,可能有一天,我把这个程序的编写过程给忘了,但是这样思考问题的方法和做事的态度,却很实用,会伴随我一生,使我受益匪浅。7参考文献1Linux0.11内核完全注释赵炯 编著2Linux内核2.4版源代码分析大全 机械工业出版社 李善平 2002.13Linux操作系统内核分析陈利君 编著 人民邮电出版社4


    注意事项

    本文(操作系统课程设计 indoe.c流程及代码分析.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922