收藏 分享(赏)

学习嵌入式linux内核网络栈代码的准备知识(1).ppt

上传人:精品资料 文档编号:11175795 上传时间:2020-02-12 格式:PPT 页数:20 大小:118.22KB
下载 相关 举报
学习嵌入式linux内核网络栈代码的准备知识(1).ppt_第1页
第1页 / 共20页
学习嵌入式linux内核网络栈代码的准备知识(1).ppt_第2页
第2页 / 共20页
学习嵌入式linux内核网络栈代码的准备知识(1).ppt_第3页
第3页 / 共20页
学习嵌入式linux内核网络栈代码的准备知识(1).ppt_第4页
第4页 / 共20页
学习嵌入式linux内核网络栈代码的准备知识(1).ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、学习嵌入式linux内核网络栈代码的准备知识(1),一.linux内核网络栈代码的准备知识 linux内核ipv4网络部分分层结构 两台主机建立udp通信所走过的函数列表 网络路径图、重要数据结构sk_buffer及路由介绍 从连接、发送、到接收数据包的过程 二.linux的tcp-ip栈代码的详细分析 1.数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto) 2.启动分析 2.1 初始化进程 2.2 do_initcalls() 中的初始化,1. linux内核ipv4网络部分分层结构:BSD socket层: 这一部分处理BSD socket相关

2、操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c /net/protocols.c etc学习嵌入式:INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。文件主要有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etcTCP/UDP层:处理传输层的操作,传输层用struct inet_protocol和st

3、ruct proto两个结构表示。文件主要有:/net/ipv4/udp.c/net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c/net/ipv4/tcp_output.c /net/ipv4/tcp_minisocks.c/net/ipv4/tcp_output.c /net/ipv4/tcp_timer.cetc,一.学习嵌入式linux内核网络栈代码的准备知识,IP层:处理网络层的操作,网络层用struct packet_type结构表示。文件主要有:/net/ipv4/ip_forward.cip_fragment.c i

4、p_input.c ip_output.c etc.学习嵌入式之数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中,驱动程序都在/driver/net目录下。2. 两台主机建立udp通信所走过的函数列表| sys_read fs/read_write.c| sock_read net/socket.c| sock_recvmsg net/socket.c| inet_recvmsg net/ipv4/af_inet.c,学习嵌入式,| udp_recvmsg net/ipv4/udp.c| skb_recv_datagram net/core/

5、datagram.c| -| sock_queue_rcv_skb include/net/sock.h| udp_queue_rcv_skb net/ipv4/udp.c| udp_rcv net/ipv4/udp.c| ip_local_deliver_finish net/ipv4/ip_input.c| ip_local_deliver net/ipv4/ip_input.c| ip_recv net/ipv4/ip_input.c| net_rx_action net/dev.c,学习嵌入式,| -| netif_rx net/dev.c| el3_rx driver/net/3c3

6、09.c| el3_interrupt driver/net/3c309.c| sys_write fs/read_write.c| sock_writev net/socket.c| sock_sendmsg net/socket.c| inet_sendmsg net/ipv4/af_inet.c| udp_sendmsg net/ipv4/udp.c| ip_build_xmit net/ipv4/ip_output.c,学习嵌入式,| output_maybe_reroute net/ipv4/ip_output.c| ip_output net/ipv4/ip_output.c| i

7、p_finish_output net/ipv4/ip_output.c| dev_queue_xmit net/dev.c| -| el3_start_xmit driver/net/3c309.cV,学习嵌入式,linux-net.pdf 第2.1章 第2.3章 第2.4章,学习嵌入式:3. 网络路径图、重要数据结构sk_buffer及路由介绍,linux-net.pdf 第4、5、6章详细阐述,学习嵌入式:4. 从连接、发送、到接收数据包的过程,1.学习嵌入式之数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto)bsd套接字层,操作的对象是so

8、cket,数据存放在msghdr这样的数据结构:创建socket需要传递family,type,protocol三个参数,创建socket其实就是创建一个socket实例,然后创建一个文件描述符结构,并且互相建立一些关联,即建立互相连接的指针,并且初始化这些对文件的写读操作映射到socket的read,write函数上来。同时初始化socket的操作函数(proto_ops结构),如果传入的type参数是STREAM类型,那么就初始化为SOCKET-ops为inet_stream_ops,如果是DGRAM类型,则SOCKET-ops为inet_dgram_ops。对于inet_stream_o

9、ps其实是一个结构体,包含了stream类型的socket操作的一些入口函数,在这些函数里主要做的是对socket进行相关的操作,同时通过调用下面提到的sock中的相关操作完成socket到sock层的传递。比如在inet_stream_ops里有个inet_release的操作,这个操作除了释放socket的类型空间操作外,还通过调用socket连接的sock的close操作,对于stream类型来说,即tcp_close来关闭sock,学习嵌入式:二.linux的tcp-ip栈代码的详细分析,释放sock。创建socket同时还创建sock数据空间,初始化sock,初始化过程主要做的事情是

10、初始化三个队列,receive_queue(接收到的数据包sk_buff链表队列),send_queue(需要发送数据包的sk_buff链表队列),backlog_queue(主要用于tcp中三次握手成功的那些数据包,自己猜的),根据family、type参数,初始化sock的操作,比如对于family为inet类型的,type为stream类型的,sock-proto初始化为tcp_prot.其中包括stream类型的协议sock操作对应的入口函数。在一端对socket进行write的过程中,首先会把要write的字符串缓冲区整理成msghdr的数据结构形式(参见linux内核2.4版源代码

11、分析大全),然后调用sock_sendmsg把msghdr的数据传送至inet层,对于msghdr结构中数据区中的每个数据包,创建sk_buff结构,填充数据,挂至发送队列。一层层往下层协议传递。一下每层协议不再对数据进行拷贝。而是对sk_buff结构进行操作。,学习嵌入式,inet套接字及以下层 数据存放在sk_buff这样的数据结构里:路由:在linux的路由系统主要保存了三种与路由相关的数据,第一种是在物理上和本机相连接的主机地址信息表,第二种是保存了在网络访问中判断一个网络地址应该走什么路由的数据表;第三种是最新使用过的查询路由地址的缓存地址数据表。1.学习嵌入式之neighbour结

12、构 neighbour_table 是一个包含和本机所连接的所有邻元素的信息的数据结构。该结构中有个元素是neighbour结构的数组,数组的每一个元素都是一个对应于邻机的neighbour结构,系统中由于协议的不同,会有不同的判断邻居的方式,每种都有neighbour_table类型的实例,这些实例是通过neighbour_table中的指针next串联起来的。在neighbour结构中,包含有与该邻居相连的网络接口设备net_device的指针,网络接口的硬件地址,邻居的硬件地址,包含有neigh_ops指针,这些函数指针是直接用来连接传输数据的,包含有queue_xmit(struct

13、* sk_buff)函数入口地址,这个函数可能会调用硬件驱动程序的发送函数。,学习嵌入式,2.FIB结构 在FIB中保存的是最重要的路由规则,通过对FIB数据的查找和换算,一定能够获得路由一个地址的方法。系统中路由一般采取的手段是:先到路由缓存中查找表项,如果能够找到,直接对应的一项作为路由的规则;如果不能找到,那么就到FIB中根据规则换算传算出来,并且增加一项新的,在路由缓存中将项目添加进去。3.route结构(即路由缓存中的结构)数据链路层:学习嵌入式之net_device结构,对应于每一个网络接口设备。这个结构中包含很多可以直接获取网卡信息的函数和变量,同时包含很多对于网卡操作的函数,这

14、些直接指向该网卡驱动程序的许多函数入口,包括发送接收数据帧到缓冲区等。当这些完成后,比如数据接收到缓冲区后便由netif_rx(在net/core/dev.c各种设备驱动程序的上层框架程序)把它们组成sk_buff形式挂到系统接收的backlog队列然后交由上层网络协议处理。同样,对于上层协议处理下来的那些sk_buff。便由dev_queue_xmit函数放入网络缓冲区,交给网卡驱动程序的发送程序处理。,学习嵌入式,在系统中存在一张链表dev_base将系统中所有的net_device结构连在一起。对应于内核初始化而言,系统启动时便为每个所有可能支持的网络接口设备申请了一个net_devic

15、e空间并串连起来,然后对每个接点运行检测过程,如果检测成功,则在dev_base链表中保留这个接点,否则删除。对应于模块加载来说,则是调用register_netdev()注册net_device,在这个函数中运行检测过程,如果成功,则加到dev_base链表。否则就返回检测不到信息。删除同理,调用unregister_netdev。,学习嵌入式,2.1学习嵌入式之初始化进程 :start-kernel(main.c)-do_basic_setup(main.c)-sock_init(/net/socket.c)-do_initcalls(main.c)void _init sock_init

16、(void)int i;printk(KERN_INFO “Linux NET4.0 for Linux 2.4n“);printk(KERN_INFO “Based upon Swansea University Computer Society NET3.039n“);/*,学习嵌入式:2.启动分析,* Initialize all address (protocol) families. 每一项表示的是针对一个地址族的操作集合,例如对于ipv4来说,在net/ipv4/af_inet.c文件中的函数inet_proto_init()就调用sock_register()函数将inet_fa

17、milies_ops初始化到属于IPV4的net_families数组中的一项。*/for (i = 0; i NPROTO; i+)net_familiesi = NULL;/* Initialize sock SLAB cache.初始化对于sock结构预留的内存的slab缓存。*/sk_init();#ifdef SLAB_SKB/*,学习嵌入式,* Initialize skbuff SLAB cache 初始化对于skbuff结构的slab缓存。以后对于skbuff的申请可以通过函数kmem_cache_alloc()在这个缓存中申请空间。*/skb_init();#endif/*

18、Wan router layer.*/#ifdef CONFIG_WAN_ROUTERwanrouter_init();#endif/*,学习嵌入式,* Initialize the protocols module. 向系统登记sock文件系统,并且将其安装到系统上来。*/register_filesystem(/* The real protocol initialization is performed when* do_initcalls is run.*/* The netlink device handler may be needed early.*/,学习嵌入式,#ifdef

19、CONFIG_NETrtnetlink_init();#endif#ifdef CONFIG_NETLINK_DEVinit_netlink();#endif#ifdef CONFIG_NETFILTERnetfilter_init();#endif#ifdef CONFIG_BLUEZbluez_init();,学习嵌入式,#endif/*yfhuang ipsec*/#ifdef CONFIG_IPSECpfkey_init();#endif/*yfhuang ipsec*/,学习嵌入式,学习嵌入式之协议初始化,路由初始化,网络接口设备初始化(例如inet_init函数以_init开头表示是系统初始化时做,函数结束后跟module_init(inet_init),这是一个宏,在include/linux/init.c中定义,展开为_initcall(inet_init),表示这个函数在do_initcalls被调用了),学习嵌入式:2.2 do_initcalls() 中的初始化,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报