【发布时间】:2010-06-19 00:14:08
【问题描述】:
我有两个与 PCI 接口的设备。我也有使用通用套接字代码的两种设备的代码。 (这些设备最初是通过 MII/以太网连接的。)
现在,我需要编写一个 PCI 设备驱动程序来在两个设备之间来回传输数据包。
如何访问由套接字代码打开的文件描述符?这和访问字符设备文件一样吗?
PCI 驱动程序必须以某种方式从代码中的 read() 和 write() 捕获数据包。
谢谢!
【问题讨论】:
我有两个与 PCI 接口的设备。我也有使用通用套接字代码的两种设备的代码。 (这些设备最初是通过 MII/以太网连接的。)
现在,我需要编写一个 PCI 设备驱动程序来在两个设备之间来回传输数据包。
如何访问由套接字代码打开的文件描述符?这和访问字符设备文件一样吗?
PCI 驱动程序必须以某种方式从代码中的 read() 和 write() 捕获数据包。
谢谢!
【问题讨论】:
你的问题的答案是:(1) 你不知道,(2) 不是。
文件描述符是一个用户空间概念,内核驱动程序不与用户空间概念交互。 (是的,它们是由内核实现的,但其他设备驱动程序不能直接使用它们,也不应该间接使用它们。)
您所做的是实现将接收缓存在内核可访问内存空间中的数据并将其发送到您的硬件的方法,然后从您的硬件接收数据并将其(当被要求时)写入内核中的缓冲区- 可访问的内存。
您将通过实现字符设备驱动程序 API 以及 PCI 设备驱动程序 API,然后将您的驱动程序注册为 PCI 设备和字符设备来实现此目的。虽然其中一些方法可能涉及文件结构,但它们不会是您熟悉和喜爱的用户级结构。
对于实施以太网协议的设备,生活会更轻松,因为您实施的是网络设备接口。这样,您只需编写将数据传入和传出硬件所需的部分。
您需要的是设备硬件规范,以及如何使用 PCI 寄存器和区域控制硬件。
好消息是,您不必单独做这件事——这里有一个庞大的内核开发者社区,还有几本关于 Linux 内核开发的好(和当前)书籍(见下文)。
参考文献
【讨论】: