新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于驱动程序的协议栈设计

基于驱动程序的协议栈设计

作者:时间:2009-06-18来源:网络收藏

  一般来说,有两种常用的方式用于栈层与层之间传送数据,如图3所示。然而,这两种方式均有缺陷,我们假设,应用层有一些数据需要传送,通常我们把它称作消息,消息需被送至栈的最底层,因为在缓冲区中没有多余的空间来存放头尾信息,而层必须给数据本身加上头尾信息,协议层或分配一个足够大的缓冲区得以容纳消息本身和头尾信息,或分配两个小缓冲区,一个用于头信息,一个用于尾信息,然后用指针将三个缓冲区链接起来。

本文引用地址:http://www.eepw.com.cn/article/152454.htm

 众所周知,每一层加入自己的头尾信息源于上一层传来的信息。因此,一个包在自上而下通过网络时,必须重复这一个过程许多次,时间被消耗于内存的分配之中(而自下而上则好得多,因为下层的头尾信息可以被上层忽略)。这种拷贝方式同时伴随着越来越大的消息,释放老缓冲区。链接方式虽然不涉及多余的拷贝,但是却将传输包的设备代码复杂化。

另一种替代的方式与设备的方式相当吻合,如图4所示。每次当创建或改变时,网络服务模块执行一个查询以确定整个的头、尾信息和最大传输单元要求,这样一来当应用程序向发消息时,网络服务模块相应地分配一些足够大容纳整个协议栈头尾信息的缓冲区,每一层仅仅将头尾信息填充至这些缓冲区,而不需内存分配或拷贝,这一机制对于性能有显著的改善。
  重传缓冲区另一个效率不高的原因在于,协议层提供确认与重传机制,一个可靠的协议层的实现通常包括为每个包分配一个重传缓冲区,将包的内容拷贝至重传缓冲区中。如果远程系统的同一层确认了正确接收,重传缓冲区将被释放,然而,如果一个“NACK”发生,协议层重传缓冲区的内容,同时再分配一个重传缓冲区,拷贝内容至重传缓冲区。
  如果已经发出的包可以被协议层标记为“Unmarked”或“Reserved”的话,上述机制就可被取消,这种情况仅保存一个指针而不拷贝。当设备完成传送包并试图释放缓冲区,缓冲区系统确认此缓冲区保留,并不释放包,仅仅将它标记为“已传输”,当相应的协议层收到确认(ACK)之后,就把包去掉标识,并且释放缓冲区,通过把这一特性固化至网络服务模块中,整个协议栈的效率将大大提高。
4 细节
  任何合理的驱动程序的协议栈都会包含相似的数据结构、数据和控制原语及模块函数。下面介绍一下细节数据结构,以下是一些可能用到的数据结构。
  (1) 设备入口提供实时和某一特殊的协议模块的管道;
  (2) 驱动程序静态变量对于每一协议层仅分配一次,不管协议层下的网络接口有多少,它是协议层的全局存储区域;
  (3) 逻辑单位静态变量仅接口分配,所以如果你有一个程序控制两个接口,就应有两个逻辑单位静态变量,但是仅有一个驱动程序变量和一个设备条目数据结构;
  (4) 路径变量基于应用程序对协议的调用,仅分配一次。
  基于上述四种定义,协议中的各种数据应被定义为最合适的类型,被选定的数据结构应当基于这个变量如何被使用:是被协议状态机所使用,还是接口或是应用程序,例如,一个特定的网络接口芯片在内存中的基址就应定义为逻辑单位静态变量。
5 函数
  如果你正开发不止一个协议栈,编写一系列通用的函数会有帮助,表1、表2描述了一些基于驱动程序的协议栈框架的数据和控制传输原语及参数。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭