基于PCI总线的通用网络协议实验平台
3 实验平台的软件设计
为了实现从处于"用户态"的应用程序到处于"核心态"的驱动程序间的双向数据传输通道,按照Linux操作系统的网络相关代码的划分规则,实验网络结构中用户层以下的代码需要嵌入到Linux操作系统的核心代码树中,经过对内核的重新编译,运行在Linux操作系统的"核心态",这样做比较复杂。鉴于以上原因,在本设计中采用了以下处理方法:考虑到"用户态"内部所有软件模块的通信比较简单,通过调用UDP/IP协议的socket,在下层利用UDP/IP数据包拆解/封装程序,构造出一个如图6所示的数据传输通道。在这里,把"透明通道"定义为"过渡层"。
使用UDP/IP协议会涉及到Linux操作系统处理IP协议的相关内容,特别需要注意以下三个方面:(1)去掉系统中所有其它网络硬件设备,关闭所有Linux操作系统的网络服务,关闭Linux操作系统防火墙;(2)设备本设备的IP地址为192.168.0.1(实验专用IP地址),绑定实验网络设备为192.168.0.X子网网关,更改"/etc/network"文件设置为"可以转发IP包";(3)调用一个IP Socket发送数据,在特定端口上监听数据包的到达。
3.1 "过渡层"的设计
对于上层传递过来的数据,"过渡层"要完成的任务是:去掉数据包前面的以太网帧头、IP数据包头、UDP数据包头,从而还原出原始数据包,然后传递给驱动部分。反之,下层传递过来的数据包经过相反的数据处理后向上层传递。
3.2 驱动程序的设计
由于W89C840AF是以太网控制芯片,因此可以把PCI接口卡看作网络设备。对于网络设备,Linux操作系统中有一套标准的驱动程序设计方法,所以在这里仅介绍驱动程序设计中的几个值得注意的事项。主要有:(1)PCI设备的探测和注册函数;(2)W89C840AF芯片的配置;(3)网络设备基本功能函数组。
PCI设备探测和注册函数可以建立网络设备对象,同时注册网络设备基本功能函数组,并参考W89C840AF芯片数据传输数据的说明赋予设备执行"DMA"能力。
关于W89C840AF芯片的配置,主要是C18/CNCR寄存器的配置。除了打开"传输允许"、"接收允许"、"全双工模式"和"100Mbps传输速率模式"等选项外,还要打开"Accept Error Packet"、"Accept Runt Packet"、"Accept Broadcast Packet"、"Accept Multicast Packet"和"Accept All Physical Packet"等选项,从而屏蔽所有与以太网协议相关的功能。
网络设备基本功能函数组的核心是"发送"、"接收"和"中断响应"这三个基本函数。"发送函数"将发送的数据存入W89C840AF芯片的内存空间,然后写C04/CTSD寄存器,请求芯片发送数据。W89C840AF芯片将接收到的数据包传递到系统内存后就会触发中断,中断处理函数响应中断并调用接收函数,将数据包和相应的参数向系统的上层传递。