项目需要使用pcie进行固件升级,为了适配原来的协议和应用,从pcie虚拟一个网卡出来进行升级。
因为Linux 内核本身已经含有了对TCP/IP协议栈的支持,最直接的方法就是开发一个基于PCI-E的虚拟网卡,这样有了IP地址,就可以通过TCP/IP协议栈进行通讯的了。
虚拟网卡的接口要求很简单,只要能够把协议栈送下来的IP包写到PCI-E的地址空间,即从虚拟网卡发送出去了;同时也能将其它虚拟网卡发送到PCI地址空间的IP包读出来,并送到上层协议栈上。虚拟网卡的接口要求很简单,只要能够把协议栈送下来的IP包写到PCI-E的地址空间,即从虚拟网卡发送出去了;同时也能将其它虚拟网卡发送到PCI地址空间的IP包读出来,并送到上层协议栈上。
其实这个过程就是把pcie共享内存看作网络phy,实现基于PCI共享内存的网卡设备驱动程序,这样就提供了TCP/IP协议栈中的数据链路层。而Linux内核中的网络子系统被设计成完全与协议无关。内核与网络驱动程序之间的交互,每次处理的是一个网络数据包;协议隐藏在驱动程序之后。这样应用程序就可以通过TCP/IP协议与网络上其他节点进行通讯了。