014 Linux网络子系统datagram模块分析报告
                    联系方式 Email: lw510@qq.com      QQ: 497053418       MSN: lw510@qq.com
以下仅为该设计的基本说明介绍,若需要完整的设计和论文,建议您购买本设计.
014 Linux网络子系统datagram模块分析报告样本
(样本只提供该系统的基本情况介绍,若需要完整的设计和论文,建议您购买本系统,凡是购买本站系统的,本站均根据您的要求,把系统上的开发信息,题目等修改成符合您的要求)
 

本设计包含内容:源代码+毕业论文
论文大概:
 
目     录
1引言………………………………………………………….……………………3
2代码分析………………………………………………………………………….5
2.1等待包函数分析……………………………………………………………..6
2.2套接口缓冲区接收的数据报结构分析……………………………………..8
2.3套接口缓冲区复制到IOVECTOR的数据报函数…………………………..10
2.4套接口缓冲区校验复制到IOVECTOR数据报……………………………..14
2.5 datagram_poll函数分析char *name)……………………………………16
3结束语……………………………………………………………………….…...19
参考文献……………………………………………………………………..……..19
附 录….……………………………………………………………………….……20
 
 
 
 
 
 
 
关于Linux网络子系统datagram.c模块分析
                          作者:潘明   指导老师:陈国顺

摘 要:Linux系统的使用越来越广泛,为Linux编制系统工具和应用软件的开发人员也越来越多。Linux的最大优势就在于它是一种开放标准,任何人都可以自由访问它的源代码。分析代码可以对系统运作有深入的了解,并能提高自身阅读和编写程序的能力。本文主要介绍的就是Linux网络子系统中datagram模块中几个主要的函数,对其结构、实现功能和流程进行了分析。
关键词:Linux;datagram;代码分析;流程图
               The Analysis of Datagram in Linux
  Abstract: The use of Linux system is more and more extensive, more and more developers are throwing themselves into working out to the systematic tool and the application software for the Linux system. The biggest advantage of Linux is that it has an open standard, so that everyone can get the source code freely. Analyzing the source code is helpful to comprehend how the operating system running, and is also helpful to read and write programs. This text introduces some of the structures, functions, and flow of the datagram.c in Linux.
Key words: Linux; datagram; analysis on source code; flow chart
 
 
 

1、引 言
Linux作为一个完全免费的网络操作系统,据不完全统计,在全世界已经有近800万用户,其中中国用户大约有近10万人,Linux目前的优越之处在于网络服务器领域,Linux+Apache已经成为网络上最普遍的服务器架构模式。
随着无数编程者对Linux代码的不断扩充和完善,Linux的源代码已经是非常庞大了,对其源代码的解读工作也变得越来越被重视。正如Linux的创始人在一篇新闻投稿上所说的,要理解一个软件的真正运行机制,一定要阅读其源代码(RTFSC-READ THE FUCKING SOURCE CODE)。
Linux的发展在国内还刚刚开始,各种看法层出不穷,可谓百花齐放,但是到目前为止,还没有一个确定的发展模式;Linux的出现,使我们开发自已的操作系统有了一个很高的起点,因为它的开放性,使我们与国外的发展几乎是同步进行的;Linux的出现正符合我们的所有要求,因为源代码公开,我们可以立刻加入开发,不仅开发速度大大快于任何商业操作系统,并且可以保证操作系统中不存在任何黑洞和隐蔽的问题,永远不会受制于人。因为Linux是国际化的,我们也不必考虑兼容性问题,永远不会同国际脱轨。
拥有一个自已的操作系统,对于我国各项事业来说都具有极高的战略意义。当前,开放源码的Linux为发展我国自主操作系统提供了一个难得的机遇。Linux是一个性能优越、技术上处于前沿的操作系统,它的源代码公开、可以被广大专业人员甚至业余爱好者所阅读、分析、学习和掌握。所以我国基于Linux开发自已的操作系统,或者说开发自已的Linux操作系统势在必行,也只有在此基础上才能构建中国自主的、比较完善的软件产业体系。为此,需要培养和造就一大批深入理解操作系统原理并有丰富实践经验的学者和工程师。
可是由于操作系统技术本身的复杂性,要深入钻研Linux的代码,把它读懂并融会贯通,实非易事。在此前提下,市场上出现了一大批关于Linux源代码分析的书,其中毛德操和胡希明老师所著的《Linux内核源代码情景分析(上、下册)》便是其中最优秀的作品之一,它覆盖了Linux内核以及有关操作系统理论(除网络外)的几乎所有方面;在所涉及的各个方面,都深入分析到具体的代码、包括汇编代码并加以讲解;在讲解中采取了独特的、以情景为基础的方法,使读者对整个过程有比较完整、比较全面的了解,从而可以把各方面的知识有机地融会贯通、加深理解。
近来与linux系统相关的课题数量也在不断增加。
在linux源代码分析方面,惠州学院信息科学与技术重点教学实验室有做过关于Linux环境下USB子系统实现框架源代码分析和Linux的消息函数的分析。
西安邮电学院有做过关于Linux文件系统的代码分析、关于Linux内核进程调度与控制的代码分析、关于Linux防火墙的实现分析的毕业设计课题。
除了做这些代码分析的课题以外,在互联网上涌现了一大批由国内编程爱好者,其中不乏一些优秀的编程人员,他们在网络论坛上发表科技文章,研究系统代码,比较著名的论坛有中国LINUX论坛http://www.linuxforum.net/和LINUX伊甸园http://www.linuxeden.com/等。
阅读源代码对提高自己的编程水平是非常有帮助的。这个帮助至少体现在三个方面。
第一个方面是学会大型软件项目设计的模式。这样的模式是真实可靠的第一手资料,这样学来的模式要比从书本上,用日常语言陈述的模式,更能深入到你的脑海中去。而且它的真实性和可靠性都是有保证的。并且这样的模式还非常的具体。
阅读源代码的第二个好处,是增加自己的自信心。就象学习英语,要和别人谈话,要看看别人的文章,不能只是看教科书上的简单的例子。类似的,只有当我们看过大型软件项目的源代码,作过修改,摸爬滚打之后,我们才能对于自己的编程能力更有信心。
阅读源代码的第三个好处,是对于过去学过的知识有复习和巩固的作用。在阅读过程中可以复习到C++,数据结构,网络与通信等方面学过的知识,并且能接触到一些新的知识。
我这次的毕业设计是Linux网络子系统datagram模块的分析,主要分析研究的linux系统版本为2.6.10,内容包括:datagram.c及其所调用到的头文件主要有module.h、types.h、kernel.h、mm.h、interrupt.h、errno.h、sched.h、inet.h、tcp.h、tcpnetdevice.h、  rtnetlink.h、poll.h、highmem.h、skbuff.h、socket.h、uaccess.h、system.h、protocol.h、  sock.h、checksum.h,还有这些头文件中包含调用的另外头文件,在此不一一罗列。由此可见分析该代码是一项工作量非常庞大,而且非常烦琐的工程。
为了能顺利进行代码分析,我使用了代码分析软件Source Insight v3.5,从而实现了对代码中一些函数、变量的定义跟踪、调用跟踪等,对我的代码分析工作起到了非常重要的意义。这是一个Windows环境下的读代码的工具,安装与一般的软件没有什么区别,它的使用简单介绍如下:
先选择Project菜单下的new,新建一个工程,输入工程名,接着按要求把欲读的源代码加入(可以整个目录加)后,该软件就会分析所加的源代码。分析完后,就可以进行阅读了。
对于打开的阅读文件,如果想看某一变量的定义,先把光标定位于该变量,然后点击工具条上的相应选项,该变量的定义就显示出来。对于函数的定义与实现也可以同样操作。
Reference功能是Source Insight的特色之一,它可以在速度极快的在整个工程中找到所有的标记,并且在该行程序的前边加上红色箭头的小按钮作为链接标志。一个Reference搜索后的结果,它可以有两种模式,一种集中显示结果模式,在这种模式下,可以通过前边的红色箭头小按钮进入;另外一种模式,该标记的具体的所在处,也可以通过标记的具体所在处点击红色箭头小按钮进入警种模式,还可以通过工具条上的两个红色小箭头直接在第二种模式下前后移动,察看相应信息。它的这个强大的功能使得阅读Linux源程序有如神助。但是要注意的是,当进行了第二次“Reference”时,它会提示将结果集附加在第一个结果集的后边还是取代第一个结果集。如果选择前者,不能对结果集根据前后两次搜索结果进行分类,然后在其子类里进行移动,只能在整个结果集里移动;如果,选择后者,结果集将会被替换为第二次搜索的结果,略微有些不方便。
就我个人的使用感觉,总体来讲,使用是很方便的,但是有一些定义会找不到,不知道是我自己的原因(比如设置不对,或者源代码没有找全),还是软件本身能力有限。

2、代码分析
datagram.c代码中所有定义的函数功能结构有
连接基础函数(connection_based)
等待包函数(wait_for_packet)
套接口缓冲区接收的数据报结构(skb_recv_datagram)
套接口缓冲区清空的数据报函数(skb_free_datagram)
套接口缓冲区复制的数据报函数(skb_copy_datagram)
套接口缓冲区复制到IO VECTOR的数据报函数(skb_copy_datagram_iovec)
套接口缓冲区复制和校验的数据报函数(skb_copy_and_csum_datagram)
套接口缓冲区校验并复制到IO VECTOR的数据(skb_copy_and_csum_datagram_iovec)
数据报轮询函数(datagram_poll)
这里挑选了其中比较重要的几个函数,等待包函数、套接口缓冲区接收的数据报结构、套接口缓冲区复制到IOVECTOR的数据报函数、套接口缓冲区校验并复制到IOVECTOR的数据和数据报轮询函数。
 
2.1等待包函数分析
这个函数的功能是等待从网络上发来的一个包。在代码开始时定义了出错函数error,0DEFINE_WAIT(wait),用等待准备函数prepare_to_wait_exclusive(sk->sk_sleep,&wait, TASK_INTERRUPTIBLE))sk->sk_sleep,&wait,TASK_INTERRUPTIBLE可打断工作。sk_sleep在sock.h中定义,说明套接口处于睡眠状态。TASK_INTERRUPTIBLE在sched.h中定义。
然后是一系列出错判断,保证套接口在等待包的过程中保持无错状态。
如果sock_error(sk)为1即套接口出错就跳转到out_err
如果!skb_queue_empty(&sk->sk_receive_queue)为1即skb队列非空就跳转到out
如果sk->sk_shutdown & RCV_SHUTDOWN为1即套接口和接收都为关闭就跳转到out_noerr
如果套接口状态处于TCP确认和TCP监听任一状态或connection_based(sk)连接上时不出错,否则跳转到out_err
如果有即时未决信号进入就跳转到interrupted
程序流程图如下:
 
 
 
 
 

 1
 
                                1
 
 
 Y
 N
 Y

N
 Y
 N
 

Y
 
 N 
 Y

                                      N
 
2.2套接口缓冲区接收数据报函数分析
函数skb_recv_datagram()要做的工作是调用函数wait_for_packet()一直等待sk->receive_queue队列上的数据到来,在两种情况下被唤醒:
(1)超时。(默认情况下,会一直阻塞等待)
(2)队列sk->receive_queue上有了数据。
如果是情况(1),则退出函数。如果是情况(2)发生,则调用函数skb_dequeue()从sk->receive_queue队列上接收数据。
代码中有一个do-while循环。这里while的条件中调用了前面分析到的[2.2等待包函数(wait_for_packet)],当wait_for_packet(sk, err, &timeo)=0即不处于等待包的状态时候进行循环。
Do循环里做的是数据接收的工作。其中if (flags & MSG_PEEK) {}是为了实现互斥。MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志。spin_lock_irqsave和spin_unlock_irqrestore是成对出现,既要和irq及其他CPU互斥,又要保存EFLAG的状态。atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态;若没有互斥情况存在,则调用skb_dequeue()从sk->receive_queue队列上接收数据。
 
 
 
 

程序流程图如下:
 
 
 
 
 
 
 
 

 Y
 N
 
 N
 Y
 N

 Y
 
3 5 6   7
 4
 
 
 
 
 
 
 
 
 3 4 5 6   7

Y
 N
 Y
 N

 Y
 N
 

2.3套接口缓冲区复制到IOVECTOR的数据报函数
函数功能是将数据从sk_buff{}结构中复制到内核分配的IOVECTOR中。
首先了解这个函数中所用到的参数变量:*skb(表示要复制的缓冲区), offset(表示在要复制的缓冲区中开始地址的偏移量),iovec (表示复制的目标IO VECTOR)*to, len(表示从缓冲区到IO VECTOR的数据的总量)。
分析其复制过程如下:
第一步,确定复制部分的起始位置,start=skb_headlen(skb),函数skb_healen( )实现的功能是计算要复制的缓冲区的头长度,计算方法是用套接口缓冲区总长度减去套接口缓冲区数据部分的长度,copy=start-offset计算方法是起始位置减去偏移量。
第二步复制起始部分。用到memcpy_toiovec( )函数,实现的功能是把数据拷贝到IOVECTOR,并返回一个是否出错的值。
第三步复制分页附录。代码中for (i =0; i < skb_shinfo(skb)->nr_frags; i++) {}所做的循环是用于复制页内容,其中有用到vaddr =kmap(page)和kunmap(page),前者实现的功能是建立映射返回页地址vaddr;后者是用于释放kmap(page)建立的映射。所以两个函数是成对出现的。
014 Linux网络子系统datagram模块分析报告
 

关闭窗口

与本站联系的时候,为了提高效率,请告诉本站您需要的设计编号与题目。如:001VBAC人事管理系统
编码说明:001VBAC人事管理系统,其中001VBAC 为该毕业设计的编号,VB代表开发语言,AC代表数据库(ACCESS)
版权所有:510计算机论文网:http://www.lw510.com/程序制作:510论文
Email: LW510@QQ.COM  QQ: 497053418   MSN: LW510@QQ.COM