ethtool 在 Linux 中的实现框架和应用

Linux 的一个显著特点就是其强大的网络功能,Linux 几乎支持所有的网络协议,并在这些协议基础上提供了丰富的应用。对 Linux 网络管理的重要性不言而喻,这些管理依赖于网络工具,比如最常用的 ifconfig,route,ip,ethtool 等,其中 ethtool 提供了强大的网卡及网卡驱动管理能力,其具体的实现框架和网络驱动程序及网络硬件关系紧密,容易修改和扩展,能够为 Linux 网络开发人员和管理人员提供对网卡硬件,驱动程序和网络协议栈的设置,查看以及及调试等功能。

Linux 网卡驱动程序对 ethtool 的支持和实现从典型的以太网控制器说起

网卡工作在 OSI 网络体系的最后两层,物理层和数据链路层,物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。物理层的芯片称之为 PHY。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。以太网卡中数据链路层的芯片称之为 MAC 控制器。很多网卡的这两个部分是做到一起的。他们之间的关系是 PCI 总线接 MAC 总线,MAC 接 PHY,PHY 接网线(当然也不是直接接上的,还有一个变压装置)。

一般地,一个典型的以太网控制器的基本结构如图 1 所示:

图 1. 一个典型的符合 IEEE802.3 标准的的以太网控制器结构图

数据链路层 MAC 是 Media Access Control 的缩写,即媒体访问控制子层协议。该协议位于 OSI 七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。在发送数据的时候,MAC 协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC 协议首先判断输入的信息并是否发生传输错误,如果没有错误,则去掉控制信息发送至 LLC 层。以太网 MAC 由 IEEE-802.3 以太网标准定义。

物理层 PHY 是物理接口收发器,它实现物理层。包括 MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、 PMD(物理介质相关)子层、MDI 子层。

MII 即媒体独立接口 , “媒体独立”表明在不对 MAC 硬件重新设计或替换的情况下,任何类型的 PHY 设备都可以正常工作。包括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII 数据接口总共需要 16 个信号,包括 TX_ER,TXD<3:0>,TX_EN,TX_CLK,COL,RXD<3:0>,RX_EX,RX_CLK,CRS,RX_DV 等。

RMII (Reduced Media Independant Interface ) 是简化的 MII 接口 ,在数据的收发上它比 MII 接口少了一倍的信号线,所以它一般要求是 50 兆的总线时钟 。RMII 一般用在多端口的交换机,它不是每个端口安排收、发两个时钟,而是所有的数据端口公用一个时钟用于所有端口的收发 ,这里就节省了不少的端口数目。RMII 的一个端口要求 7 个数据线 ,比 MII 少了一倍,所以交换机能够接入多一倍数据的端口。和 MII 一样,RMII 支持 10 兆和 100 兆的总线接口速度 。

GMII(Gigabit MII) 是千兆网的 MII 接口,这个也有相应的 RGMII 接口,表示简化了的 GMII 接口。GMII 采用 8 位接口数据,工作时钟 125MHz,因此传输速率可达 1000Mbps 。同时兼容 MII 所规定的 10/100 Mbps 工作方式。

MII 管理接口是个双信号接口,一个是时钟信号 MDC,另一个是数据信号 MDIO。通过管理接口,上层能监视和控制 PHY 的寄存器。PHY 里面的部分寄存器是 IEEE 定义的,这样 PHY 把自己的目前的状态反映到寄存器里面,MAC 通过管理接口不断的读取 PHY 的状态寄存器以得知目前 PHY 的状态,例如连接速度,双工的能力等。当然也可以通过管理接口设置 PHY 的寄存器达到控制的目的,例如流控的打开关闭,自协商模式还是强制模式等,这也是 ethtool 的工作原理。

MDIO/MDC,即 PHY 管理接口串行通信总线,该总线由 IEEE 通过以太网标准 IEEE 802.3 的若干条款加以定义。MDIO 是一种简单的双线串行接口,将管理器件 ( 如 MAC 控制器、微处理器 ) 与具备管理功能的收发器 ( 如多端口吉比特以太网收发器或 10GbE XAUI 收发器 ) 相连接,从而控制收发器并从收发器收集状态信息。可收集的信息包括链接状态、传输速度与选择、断电、低功率休眠状态、TX/RX 模式选择、自动协商控制、环回模式控制等。除了拥有 IEEE 要求的功能之外,收发器厂商还可添加更多的信息收集功能。

MDC 则是管理数据的时钟输入,最高速率可达 8.3MHz。MDIO 是管理数据的输入输出双向接口,数据是与 MDC 时钟同步的。MDIO 的工作流程为:

MDIO 接口在没有传输数据的空闲状态(IDLE)数据线 MDIO 处于高阻态。

MDIO 出现一个 2bit 的开始标识码 (01) 一个读 / 写操作开始。

MDIO 出现一个 2bit 数据来标识是读操作 (10) 还是写操作 (01)。

MDIO 出现一个 5bit 数据标识 PHY 的地址。

MDIO 出现一个 5bitPHY 寄存器地址。

MDIO 需要 2 个时钟的访问时间。

MDIO 串行读出 / 写入 16bit 的寄存器数据。

MDIO 恢复成 IDLE 状态,同时 MDIO 进入高阻状态。

注:以上内容部分摘选自互联网。

Linux 设备驱动程序中对 ethtool 的支持

目前几乎所有的网卡驱动程序都有对 ethtool 的支持,其框架如图 2 所示,ethtool 框架包含内核空间和用户空间两部分:用户空间的部分负责将 ethtool 命令发送到内核,并接收命令的执行结果;内核空间的部分根据相应的命令字,通过 MDIO/MDC 读写 MII 寄存器,实现对网卡的管理,并把执行结果传回用户空间。由于 Linux 网络驱动程序是一个复杂而庞大的体系,这里只介绍驱动程序中对 MII 寄存器的定义,对 MDIO/MDC 的支持以及驱动程序中实现如何实现 ethtool 功能部分。

图 2.ethtool 在 Linux 中的实现框架

IEEE 802.3 规定的 MII 寄存器

关于 MII/GMII 接口 PHY 寄存器的定义在 802.3 的 22.2.4 Management functions. 章节中,如该章节中的 Table 22 – 6 和 Table 22 – 7(即本文的图 3 和图 4,均出自 )所示,

图 3. IEEE802.3 定义的 MII 管理寄存器集

在乎的是看风景的心情,旅行不会因为美丽的风景终止。

ethtool 在 Linux 中的实现框架和应用

相关文章:

你感兴趣的文章:

标签云: