Linux - Nic 的标志配置

Linux - Nic's flags configuration

上下文

Debian 64 位。内核 3.18.x

很难理解网络驱动程序是如何初始化的。

我的意思是如何选择设置哪个标志。我在内核中挖掘了好几天来训练自己。卡片设置是我唯一想念的地方。

我以intel 82574为例。我下载了该卡的数据表,看到了很多信息,但没有关于如何设置硬件的线索。

问题

从哪里开始 知道要设置什么标志?数据表对我没有帮助(我不是很有经验但愿意学习)。

请给我一个起点、提示或任何东西,以帮助我理解已经编写的开源驱动程序中发生了什么。

开发人员如何知道如何初始化他的网卡? (是的,重新发明轮子的时候明白了

您需要阅读处理特定 NIC 的内核模块的源代码。

编辑:当然,要开发这样的模块,您通常只需使用数据 sheet 或应用程序节点中指定的寄存器映射;通常,制造商自己开发 linux 驱动程序,因此驱动程序开发人员甚至可能是开发芯片组的人(因为拥有一个测试平台真的很方便——如果没有某些东西就无法测试硬件 喜欢一个驱动程序,所以你不妨写一个合适的驱动程序)。

此外,设备通常带有代码示例 -- 没有人会基于他从未见过的 IC 来构建设备。

如果您既无法访问适当的文档也无法访问源代码,则只能进行逆向工程 - 这是一个非常大的领域。

使用英特尔 82574 网络适配器的示例,英特尔提供了用于构建 Linux 驱动程序的源代码的 zip 文件。该驱动程序与所有驱动程序一样,它连接到 OS API 以进行网络连接。

Linux 网络 API 是 linux.org 站点上的文档,并在 lwn.org 等热门 Linux 站点上进行了讨论。下面是 link 到 lwn 的关于网络驱动程序的章节使用名为 NAPI 的网络 API。

https://static.lwn.net/images/pdf/LDD3/ch17.pdf

您会在 Intel igb 驱动程序源代码中注意到 NAPI net_device 数据结构是最先设置的内容之一。它使用 OS 注册驱动程序。这样 OS 知道在 loading/unloading 驱动程序或需要 send/receive 数据时调用哪个 igb 函数。

igb 函数 read/modify/write 82574 的内存映射寄存器中控制和监视设备的必要位。设备寄存器都记录在英特尔网站上提供的 82574 数据表中。这通常是几乎所有网络公司的情况,例如 Broadcom/Chelsio/Mellanox/Marvell.

希望对您有所帮助。