我想了解一个设备驱动模块在 linux 内核中的性能。在这种情况下,我在 linux 中使用carl9170设备驱动程序。
如果我使用两个物理接口,单模块carl9170如何处理2个不同的物理接口?
因为到目前为止,我知道这 2 个物理接口将创建 2 个实例并为每个实例使用不同的数据包缓冲区,但只使用单个 carl9170 模块。所以这让我很困惑。
我可以在linux内核源代码中找到关于这种处理方法的哪个文件(与carl9170设备驱动程序有关)?
非常感谢您的帮助
对于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
.