【问题标题】:Interfacing socket code with a Linux PCI driver将套接字代码与 Linux PCI 驱动程序连接
【发布时间】:2010-06-19 00:14:08
【问题描述】:

我有两个与 PCI 接口的设备。我也有使用通用套接字代码的两种设备的代码。 (这些设备最初是通过 MII/以太网连接的。)

现在,我需要编写一个 PCI 设备驱动程序来在两个设备之间来回传输数据包。

如何访问由套接字代码打开的文件描述符?这和访问字符设备文件一样吗?

PCI 驱动程序必须以某种方式从代码中的 read() 和 write() 捕获数据包。

谢谢!

【问题讨论】:

    标签: sockets driver device pci


    【解决方案1】:

    你的问题的答案是:(1) 你不知道,(2) 不是。

    文件描述符是一个用户空间概念,内核驱动程序不与用户空间概念交互。 (是的,它们是由内核实现的,但其他设备驱动程序不能直接使用它们,也不应该间接使用它们。)

    您所做的是实现将接收缓存在内核可访问内存空间中的数据并将其发送到您的硬件的方法,然后从您的硬件接收数据并将其(当被要求时)写入内核中的缓冲区- 可访问的内存。

    您将通过实现字符设备驱动程序 API 以及 PCI 设备驱动程序 API,然后将您的驱动程序注册为 PCI 设备和字符设备来实现此目的。虽然其中一些方法可能涉及文件结构,但它们不会是您熟悉和喜爱的用户级结构。

    对于实施以太网协议的设备,生活会更轻松,因为您实施的是网络设备接口。这样,您只需编写将数据传入和传出硬件所需的部分。

    您需要的是设备硬件规范,以及如何使用 PCI 寄存器和区域控制硬件。

    好消息是,您不必单独做这件事——这里有一个庞大的内核开发者社区,还有几本关于 Linux 内核开发的好(和当前)书籍(见下文)。

    参考文献

    【讨论】:

    • 感谢您的快速回复!让我们看看我是否理解你写的内容。我必须为目标设备编写一个 PCI 驱动程序。驱动程序还将分配一个具有所有 TX/RX 功能的以太网接口。现在我打开一个套接字,这就是我感到困惑的地方。您是否有关于将创建的套接字“链接”/“绑定”到特定以太网 PCI 设备的信息?我不想通过另一个 PCI 以太网设备传输数据。
    • 为了让您的设备显示为可能的网络接口,您必须将驱动程序加载到内存中。驱动程序将注册与您的设备匹配的 PCI ID。之后,您需要使用网络地址配置您的驱动程序(类似于将 IP 地址映射到 eth0)。此时,无论出于何种意图和目的,它都是网卡,并且被操作系统视为网卡。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多