1

我想了解一个设备驱动模块在 linux 内核中的性能。在这种情况下,我在 linux 中使用carl9170设备驱动程序。

  1. 如果我使用两个物理接口,单模块carl9170如何处理2个不同的物理接口?

    因为到目前为止,我知道这 2 个物理接口将创建 2 个实例并为每个实例使用不同的数据包缓冲区,但只使用单个 carl9170 模块。所以这让我很困惑。

  2. 我可以在linux内核源代码中找到关于这种处理方法的哪个文件(与carl9170设备驱动程序有关)?

非常感谢您的帮助

4

1 回答 1

1

对于2,看一下文件夹:

drivers/net/wireless/ath/carl9170/

该文件夹位于您的内核源代码目录下。它包含驱动程序的所有来源。

对于 1:

这几乎就是面向对象编程中类的工作方式:对象如何知道它必须使用的数据实例?指针引用正确的this内存数据。

看看文件drivers/net/wireless/ath/carl9170/carl9170.h。驱动程序导出的每个函数都在此文件中声明。请注意,每个函数的第一个参数都有对struct ar9170数据类型的引用。这正是驱动程序必须使用的数据集。它指定了驱动程序需要了解的有关设备及其状态的所有信息,因为设备连接的 USB 总线地址,设备的状态,如电源、连接状态和驱动程序本身需要的任何其他数据,以便保持设备正常工作。

请注意,这是驱动程序内部数据的想法。内核有自己的一组数据来保持驱动程序、设备和内核本身的工作。

看一下carl9170.h的 546 行。这是函数声明开始的地方。该文件从内核 3.8.8 开始。

就像在面向对象编程中一样,您可以根据需要分配尽可能多的类实例,内核将根据需要分配尽可能多ar9170的结构,一个引用每个设备。

设备id可以在/sys/class/net目录下获取。连接到您计算机的每个网络设备都有一个软链接。此链接会将设备指向以下内容:

$ ls -l eth0
../../devices/pci0000:00/0000:00:04.0/0000:02:00.0/net/eth0

pci0000:00公共汽车。我0000:00:04.0相信是总线地址。最后,0000:02:00.0是设备ID。Afaik,每个注册的设备都遵循相同的逻辑。

最后,如果您有两个carl9170设备,它们都将在目录下,/sys/class/net但可能其中一个将被命名wifi0,另一个将被命名为wifi1. 此外,它们中的每一个都将指向不同的设备(使用命令检查ls -l /sys/class/net)。

我只想指出,在解释中我没有使用任何无线网卡。所以我不确定无线网卡是否显示在下方/sys/class/net。无论如何,这将是非常相似的东西,比如/sys/class/wireless.

于 2013-04-17T12:04:11.270 回答