2007|0

1018

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

Linux内核之数据包的传递过程(二) [复制链接]

在驱动程序层和网络层直接还有一层是接口层,叫做驱动程序接口层,用来整合不同的网络设备。下面由卓跃教育为您介绍Linux内核网络IP协议的实现原理。
  其实现的文件主要是net/inet/ip.c文件中,我们首先分析下ip_init()初始化函数,这个函数是如何被调用的呢?
  下面是调用的过程:
  首先是在系统启动过程main.c中调用了sock_init()函数,然后调用了proto_init()函数,而protocols全局变量协议向量表的定义中对INET域中协议的初始化函数设置为inet_proto_init(),看到在inet_proto_init()函数中调用了ip_init()对IP层进行了初始化。代码中inet_protocol_base指向的链表为&igmp_protocol-->&icmp_protocol-->&udp_protocol-->&tcp_protocol-->NULL(定义在protocol.c中)。分析ip_init()函数需要先要知道packet_type结构,这个结构体是网络层协议的结构体,网络层协议与该结构体一一对应。
  第一个字段的网络层协议编号定义在include/linux/if_ether.h中
  第二个字段表示处理包的网络接口设备,一般初始化为NULL。
  第三个字段为相应网络协议的处理函数。
  第四个字段是一个void指针。
  第五个字段是next指针域,用于将该结构连接成链表。
  这里需要说明的是系统采用主动通知的方式,其实现是有赖于notifier_block结构,其定义在notifier.h中。
  您有任何关于Linux的疑问,欢迎咨询在线老师
  对于网卡设备而言,网卡设备的启动和关闭是事件,内核需要得到通知从而采取相应的措施。其原理是:当事件发生时,事件通知者便利某个队列,对队列中感兴趣(符合条件)的被通知者调用被通知者注册是定义的通知处理函数,从而达到让内核做出相应的操作。
  中断返回后系统会执行下半段,即执行net_bh()函数,该函数会扫描网络协议队列,调用相应的协议的接收函数,IP协议就会调用ip_rcv(),接下来分析ip_rcv()函数,这是IP层的接收函数,接收来自链路层的数据。
  标志位三位,分别是:保留,DF(可以分片),MF(还有后续分片)。
  内核中用于封装网络数据的最重要的数据结构sk_buff定义在
  include/linux/skbuff.h中。
  通过上文,您对Linux是否有了一定的了解。如果您还有任何Linux方面的疑问,可以登录www.51great.org,点击在线咨询与在线老师交流。您也可以拨打我们的全国免费咨询专线:0591-83713060进行咨询。
  
此帖出自信息发布论坛
点赞 关注
个人签名android培训
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表