linuxtlp
① Linux下PCI设备驱动开发详解(五)
本系列文章旨在深入解析Linux下PCI设备驱动开发过程,本文作为五部曲的第五章,将详细探讨通过PCI Express总线实现CPU与FPGA间数据通信的简单框架。这一框架即RIFFA(reuseable integration framework for FPGA accelerators),一个由第三方开源的PCIe框架,支持Windows、Linux环境,适用于Altera和Xilinx的FPGA板卡。
RIFFA框架要求具备一个支持PCIe的工作站与FPGA板卡,能够通过PCIe连接实现数据交互。该框架支持多种编程语言,如C/C++、Python、MATLAB、Java,可实现数据发送与接收。每一系统最多支持5个FPGA设备。
框架的核心在于简化硬件接口,利用FIFO进行数据读取与存储。数据传输由RX和TX DMA引擎模块通过分散聚合方法执行,其中RX引擎接收上位机数据,完成后传递给通道模块;TX引擎则收集通道模块的数据,打包发送至PCIe端点。
在软件层面,PC接收FPGA数据时,调用库函数fpga_recv,然后通过FPGA启动操作。用户应用程序线程进入内核驱动程序,接收FPGA的读请求,分包发送数据,并在未收到请求时等待响应。启动发送函数后,服务器建立数据散列收集元素列表,将地址、长度等信息写入共享缓冲区,用户应用程序将这些信息传递给FPGA,后者读取散列收集数据,发出地址对应的数据写入请求。如果列表中有多个地址,FPGA将通过中断发出相应请求。
传输过程遵循直接存储器访问(DMA)和中断信号传输,以实现PCIe链路的高带宽,运行速率可达链路饱和点。驱动程序在开始前需要调用pci_present()检查PCI总线支持情况,通过pci_register_driver()函数注册驱动程序,并提供“demo_pci_driver”结构,其中的probe探测例程负责硬件检测。
文章接下来将对用户逻辑、PCIe硬IP、TX/RX引擎以及RIFFA模块进行深入分析,结合理论基础、实际操作与源代码,逐步构建对整个框架的理解。首先,我们将从FPGA xilinx integrated block for PCI express出发,探讨其配置与功能。
在PCIe硬IP部分,我们将关注配置参数,如AXI总线时钟、总线接口位宽、ID设定、厂商ID与设备ID、基类菜单、bar空间配置等。此外,我们将详细分析中断配置、IP核接口参数,以及顶层代码接口,理解其在设计架构中的作用。
接下来,我们深入探讨tx_engine与rx_engine模块,这些模块负责转换axis数据与tlp数据。文章将提供源代码示例,展示这些核心模块的实现方式,以及如何通过C_NUM_CHNL、C_PCI_DATA_WIDTH、C_LOG_NUM_TAGS配置通道、数据位宽与tag个数。
最后,我们将介绍user logic部分,即如何使用CHNL_TX_和CHNL_RX_接口,实现数据的发送与接收。此外,文章将总结框架的结构与功能,以及如何在Linux环境下开发、安装驱动程序。
敬请期待Linux下PCI设备驱动开发详解(六),我们将深入探讨内核态驱动的开发与实现,以完成这一系列文章的内容。
② Linux系统中netstat命令的基本使用方法
Linux系统中netstat命令的基本使用方法:
基本语法:netstat [acCeFghilMnNoprstuvVwx][A网络类型][ip]
常用参数:
- a或–all:显示所有连线中的Socket。
- A网络类型:列出该网络类型连线中的相关地址。
- c或–continuous:持续列出网络状态。
- e或–extend:显示网络其他相关信息。
- i或–interfaces:显示网络界面信息表单。
- l或–listening:显示监控中的服务器的Socket。
- n或–numeric:直接使用IP地址,而不通过域名服务器。
- o或–timers:显示计时器。
- p或–programs:显示正在使用Socket的程序识别码和程序名称。
- r或–route:显示Routing Table。
- s或–statistice:显示网络工作信息统计表。
- t或–tcp:显示TCP传输协议的连线状况。
- u或–udp:显示UDP传输协议的连线状况。
- v或–verbose:显示指令执行过程。
- w或–raw:显示RAW传输协议的连线状况。
- x或–unix:显示UNIX域套接口的连接情况。
使用示例:
- 查看当前TCP监听端口:netstat tl 或 netstat nltp。
- 查看当前TCP监听端口并显示监听程序名:netstat tlp。
- 查看特定端口的TCP连接:netstat tl | grep 34006。
- 查看特定端口的所有TCP连接:netstat ta | grep 34006。
- 结合PID查看特定端口的TCP连接:netstat tap | grep 34006 | grep 23425。
注意事项:
- netstat命令在Linux系统中已被视为过时,官方已不再更新,建议使用ss和ip命令替代。
- 输出结果中的字段如Proto、RecvQ、SendQ、Local Address、Foreign Address和State等分别表示协议类型、接收队列、发送队列、本地地址、远程地址和连接状态。
通过合理使用netstat命令及其参数,可以全面了解Linux系统的网络连接和状态信息。