- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.7.3 重要数据结构 2.硬件相关部分 标识设备使用的共享内存的首地址及尾地址,包括如下域段: unsigned long rmem_end; unsigned long rmem_start; unsigned long mem_end; unsigned long mem_start; 3.物理层相关数据 4.网络层协议相关部分 5.服务处理部分 5.7.4 网络设备的初始化 网络设备在激活前必须满足两个条件,第一是确实存在相应的硬件设备,第二这个设备已经被正确登记在base_dev指向的结构链表中。接口函数init()的任务就是完成这两项工作。函数定义如下: int (*init) (struct device *dev); 参数是指向需要初始化设备的dev,正常返回值是0。在实际驱动程序中这个函数映射为一个实际的函数。 如果驱动程序采用模块化加载方法,模块化初始化过程中register_netdev() 调用init()的映射函数完成初始化;如果驱动程序是内核加载型,init()的映射函数加入到系统网络设备的Space.c中在内核初始化时被调用。 Init()函数具体实现功能包含以下几方面:检测设备是否存在;自动检测该设备的I/O端口和中断号;填写设备net_device结构的大部分域段;用kmalloc()分配所需的内存空间。若初始化失败,该设备的net_device结构就不会被链接到全局的网络设备表上。 5.7.5 打开和关闭网络设备 在实际使用网络设备前需要激活网络设备,可以使用ifconfig命令把一个设备设为up时就调用激活函数激活网络设备,激活函数原形定义为: int (*open) (struct device *dev); 所以又经常把激活函数称为open()函数,不过它和字符和块设备的open函数并不一样。与open()函数对应,网络设备也有关闭函数,其原形定义为: int (*stop) (struct device *dev); 它执行和Open完全相反的工作。激活函数主要工作包括登记一些需要的系统资源,如IRQ、DMA、I/O端口等;把硬件复位,如果是模块方式加载还要把module使用数量加1。因为在函数初始化时已经登记了要使用的资源,所以这里激活函数的主要任务就是硬件复位了。 5.7.6 发送过程的实现 数据包的发送和接收是实现Linux网络驱动程序中两个最关键的过程,这两个过程处理的好坏将直接影响到驱动程序的整体运行质量。首先在网络设备驱动加载时,通过device域中的init()函数指针调用网络设备的初始化函数对设备进行初始化,如果操作成功就可以通过device域中的open()函数指针调用网络设备的打开函数打开设备,再通过device域中的建立硬件包头函数指针hard_header来建立硬件包头信息。最后通过协议接口层函数dev_queue_xmit调用device域中的hard_start_ximt函数指针来完成数据包的发送。 5.7.7 接收过程的实现 接收函数一般由中断控制程序调用,负责把网络设备接收到的数据以一定格式提交给内核中的网络层模块。 sk_buff结构 sk_buff是Linux网络协议栈中一个重要数据结构,网络协议栈中的各层协议都可以通过对它的操作实现本层协议数据的添加或者提取,这种机制避免了协议数据单元在不同的协议层间被来回复制情况的发生,提高了执行效率。 sk_buff的数据分成两大部分,一部分是实际在网络中要传输的部分,就是常说的数据区。另一部分是用于内核进行管理的部分。在此着重介绍常用的几个域段。其中有四个数据指针指向数据区相应的位置。 unsigned char *head:指向被分配的内存空间的首地址; unsigned char *data:指向当前数据包的首地址; unsigned char *tail:指向当前数据包的末地址; unsigned char *end:指向被分配的内存空间的末地址; unsigned long len:当前数据包的大小。len=skb-tail – skb-data; unsigned long truesize:分配到的内存空间大小。len=skb-end – skb-head; struct net_device *dev:接收或者发送该数据包的网络设备; unsigned short protocol:数据包使用的网络层协议。 5.7.8 中断控制 中断是现代操作系统的一大特点,在嵌入式系统尤为明显,中断函数在驱动程序中的作用非常重要,相当于各种函数的调度中心。数据包被接收、数据包发送完毕、buffer分配
您可能关注的文档
- 工业设计概论基本第三章.ppt
- 工业设计概论基本第十章.ppt
- 工业设计概论基本第四章.ppt
- 工业设计概论基本第五章.ppt
- 工业设计机械基础第七章、第八章.ppt
- 工业设计机械基础第三章、第四章.ppt
- 工业设计机械基础第五章、第六章.ppt
- 工业设计机械基础第一章、第二章.ppt
- 工业生产过程与管理第1章 工业生产概论.pptx
- 工业生产过程与管理第2章 工业生产组织与管理.pptx
- 某某单位2024年党建工作总结及2025年工作计划.doc
- 某某市发改委关于2024年度落实党风廉政建设工作责任制情况的报告.doc
- 某某局2024年全面从严治党和党风廉政建设工作总结.doc
- 某某区财政局2024年法治政府建设总结及2025年工作谋划.doc
- 2024年党管武装工作述职报告2篇.doc
- 2024年度国企党委书记抓基层党建工作述职报告3篇.doc
- 公司党委书记2024年述职述廉报告.docx
- 2024年度乡镇党委领导班子民主生活会(四个带头)对照检查材料.doc
- 市医疗保障局关于2024年法治政府建设工作情况的报告.docx
- 市民政局党组2024年巡察整改工作情况报告.docx
文档评论(0)