以太网扫盲(三)Cache和各种网络总线
Cache
在网口驱动(尤其是涉及 DMA 的驱动)中,Cache 是一个非常关键但又容易被忽视的问题。简单说,Cache 是 CPU 内部高速缓存,它会导致 CPU 和 DMA 控制器看到的内存数据不一致,从而引发数据错误。
一、什么是 Cache?
Cache(高速缓冲存储器) 是 CPU 内部的一块极快的 SRAM,用于自动缓存主存(DRAM)中的部分数据。CPU 访问 Cache 的速度比访问主存快 10~100 倍。
现代 CPU 通常有 L1、L2、L3 多级 Cache,其工作对软件透明:当 CPU 读一个内存地址时,硬件会先检查 Cache 中是否有该地址的副本(Cache 命中),如果有就直接返回;如果没有(Cache 未命中),则从主存加载到 Cache 后再返回。写操作也类似,通常会先写入 Cache,稍后再回写到主存(写回策略)。
关键性质:Cache 中的数据和主存中的数据可能暂时不一致。
二、为什么网口驱动需要关心 Cache?
在网口驱动的数据收发中,有两条独立的数据路径:
-
CPU 路径:CPU 通过指令读写内存(例如修改描述符、处理接收到的数据包)。
-
DMA 路径:网卡(DMA 控制器)直接读写主存,不经过 CPU Cache。
这两条路径共享同一块主存,但 DMA 看不到 CPU 的 Cache,CPU 看到的可能是 Cache 中的旧副本。这就产生了 Cache 一致性问题。
三、典型场景:
场景一:接收数据(RX)
-
驱动预先分配接收缓冲区,并将缓冲区物理地址写入 DMA 描述符(CPU 写内存)。
-
网卡收到数据,DMA 将数据写入该缓冲区(DMA 写主存)。
-
CPU 在中断服务程序中读取缓冲区内容。但此时,该缓冲区地址可能仍然存在于 CPU 的 Cache 中,且 Cache 中的内容是旧的(全零或之前的数据)。CPU 从 Cache 读,就读不到新收到的网络数据。
场景二:发送数据(TX)
-
CPU 将要发送的数据包写入内存缓冲区(CPU 写 Cache),数据可能还留在 Cache 中,未写回主存。
-
驱动将缓冲区地址交给 DMA 描述符,并启动 DMA 发送。
-
DMA 直接从主存读取数据,但主存中可能还没有 CPU 刚刚写入的最新数据(因为还在 Cache 里)。结果网卡发送出去的是旧数据或全零。
场景三:描述符环本身
描述符环也是内存中的数据结构。CPU 修改描述符的 OWN 位(从 0 改到 1),然后通知 DMA。如果描述符还在 Cache 中,DMA 看到的可能是旧的 OWN 位(0),从而不会处理该描述符。
四、Cache 一致性问题的表现
• 收包数据错乱:收到的数据包内容部分是旧数据,部分正确;或者完全乱码。
• 发送数据错误:网卡发送出错误内容,对端收到乱码。
• 驱动卡死:因为描述符的 OWN 位 DMA 看不到更新,硬件认为没有可用描述符,停止收发。
• 偶发性问题:由于 Cache 写回时机不确定,问题可能时好时坏,极难调试。
五、如何解决 Cache 一致性问题?
有两种思路:硬件一致性 和 软件维护。
5.1 硬件一致性(IOMMU/SMMU 或 硬件 Cache 一致性协议)
-
某些高级 SoC 或 CPU(如 x86 的 Intel VT-d、ARM 的 SMMU)支持 I/O 虚拟化,可以使得 DMA 访问时自动 snoop CPU Cache,或使用 ACP(ACE-Lite) 端口实现一致性。
-
这种情况下,驱动不需要特殊处理,但会消耗额外总线带宽。
-
在嵌入式系统中(如 Cortex-M 系列 MCU),通常没有硬件一致性支持,必须靠软件。
5.2 软件维护 Cache(最常用)
软件通过 CPU 提供的 Cache 维护指令,在适当的时候刷新(Flush)或无效化(Invalidate)Cache 行。
关键操作:
-
Cache Flush(写回):将指定地址范围在 Cache 中的脏数据强制写回主存,使主存与 Cache 一致。用于发送方向(CPU 写数据后,确保 DMA 看到最新数据)。
-
Cache Invalidate(无效化):将指定地址范围在 Cache 中的缓存行标记为无效,下次 CPU 读该地址时会从主存重新加载。用于接收方向(DMA 写数据后,让 CPU 重新从主存读取)。
典型驱动流程(以 ARM Cortex-A 为例):
接收方向(DMA 写主存 → CPU 读):
// 1. DMA 写完数据到 rx_buffer,触发中断
// 2. 中断服务程序中,在读取 rx_buffer 之前:
dcache_invalidate_range(rx_buffer, rx_buffer + length);
// 3. 现在 CPU 读取 rx_buffer 会从主存重新加载,看到 DMA 写入的新数据
发送方向(CPU 写数据 → DMA 读):
// 1. CPU 将数据包写入 tx_buffer
// 2. 在将 tx_buffer 地址交给 DMA 描述符之前:
dcache_flush_range(tx_buffer, tx_buffer + length);
// 3. 确保主存中的数据是最新的,然后才启动 DMA
描述符环(CPU 修改描述符 → DMA 读描述符):
-
描述符通常放在 非缓存内存(non-cacheable)中,或者每次修改描述符后执行
dcache_flush针对描述符所在的行。 -
更常见:使用 一致性 DMA 内存(见下文)。
5.3 使用一致性 DMA 内存(推荐)
许多操作系统(Linux、FreeRTOS 等)提供 API 来分配 DMA 一致性内存。这种内存区域通常是 非缓存(uncached)或 写合并 的,对 CPU 和 DMA 总是保持一致性。
Linux 示例:
// 分配一致性内存:CPU 和 DMA 看到的数据始终一致,无需手动 flush/invalidate
void *cpu_addr = dma_alloc_coherent(dev, size, &dma_handle, GFP_KERNEL);
-
cpu_addr是 CPU 访问的虚拟地址(可能经过 Cache,但硬件保证一致性)。 -
dma_handle是物理地址(供 DMA 使用)。 -
内部实现可能使用非缓存内存,或硬件 snooping。
裸机/RTOS:可以手动将描述符和缓冲区分配到 非缓存内存区域
(例如通过链接脚本定义 .nocache 段,或配置 MPU 将该区域设为 Non-cacheable)。
优点:简单,不容易出错。
缺点:非缓存内存访问较慢(每次 CPU 读写都要穿透到主存)。但对于描述符和短暂的数据缓冲区,性能影响通常可接受。
六、实际驱动开发中的常见做法
| 数据类型 | 推荐存放位置 | Cache 维护操作 |
| DMA 描述符环 | 一致性内存(non-cacheable) | 无需手动维护 |
| 接收缓冲区 | 一致性内存(或动态分配后 invalidate) | 若为普通内存,在接收中断中 invalidate |
| 发送缓冲区 | 普通内存(协议栈提供) | 在发送前 flush(或使用 dma_map_single 自动处理) |
| 控制寄存器 | 直接映射的 non-cacheable 区域 | 无需维护 |
Linux 内核高级接口(推荐使用,自动处理 Cache):
-
dma_map_single(dev, cpu_addr, size, direction)→ 返回 DMA 地址。根据 direction,它会执行必要的 flush/invalidate。 -
dma_unmap_single(dev, dma_addr, size, direction)→ 完成时调用,可能 invalidate。 -
dma_sync_single_for_cpu()/dma_sync_single_for_device()用于在访问切换时同步。
这些 API 考虑了体系结构差异,驱动开发者应优先使用,而不是直接调用底层 Cache 操作。
七、体系结构差异(重要)
-
x86(PC 平台):DMA 默认是 Cache 一致性的(因为 x86 的 DMA 会 snoop CPU Cache)。所以在 x86 上开发网口驱动时,通常不需要手动维护 Cache。但描述符和缓冲区仍推荐使用一致性****内存(但实际不加也能工作,因为硬件帮你做了)。
-
ARM(多数嵌入式):不保证硬件一致性。必须手动维护 Cache 或使用非缓存内存。这是嵌入式网口驱动最容易出问题的地方。
-
PowerPC、MIPS:类似 ARM,需要软件维护。
八、调试 Cache 不一致问题的方法
-
临时禁用 Cache(例如设置 MMU 使所有内存 non-cacheable)。如果问题消失,则确定是 Cache 一致性问题。
-
在关键位置插入 Cache 操作(先 flush 再读,观察数据变化)。
-
使用逻辑分析仪或硬件断点,对比 CPU 和 DMA 访问的物理地址上的实际数据。
MII
MII(Media Independent Interface)即媒体独立接口,MII 接口是 MAC 与 PHY 连接的标准接口。它是 IEEE-802.3 定义的以太网行业标准。MII 接口提供了 MAC 与 PHY 之间、PHY 与 STA(Station Management)之间的互联技术,该接口支持 10Mb/s 与 100Mb/s 的数据传输速率,数据传输的位宽为 4 位。MII 接口如下图所示:

“媒体独立” 表明在不对 MAC 硬件重新设计或替换的情况下,任何类型的 PHY 设备都可以正常工作。802.3 协议最多支持 32 个 PHY,但有一定的限制:要符合协议要求的 connector 特性。此外,提到 MII,就有可能涉及到 RS,PLS,STA 等名词术语,下面讲一下他们之间对应的关系。
所谓 RS 即 Reconciliation sublayer,它的主要功能主要是提供一种 MII 和 MAC/PLS 之间的信号映射机制。它们(RS 与 MII)之间的关系如下图:
MII接口主要包括四个部分。一是从MAC层到PHY层的发送数据接口,二是从PHY层到MAC层的接收数据接口,三是从PHY层到MAC层的状态指示信号,四是MAC层和PHY层之间传送控制和状态信息的MDIO接口。

MII 包括一个数据接口,以及一个 MAC 和 PHY 之间的管理接口:
-
数据接口: 包括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII 数据接口总共需要 16 个信号,包括
-
TX_ER(transmit coding error): TX_ER 同步于 TX_CLK,在数据传输过程中,如果 TX_ER 有效超过一个时钟周期,并且此时TX_EN 是有效的,则数据通道中传输的数据是无效的,没用的。注:当 TX_ER 有效并不影响工作在 10Mb/s 的 PHY 或者 TX_EN 无效时的数据传输。在 MII 接口的连线中,如果 TX_ER 信号线没有用到,必须将它下拉接地。
-
TXD<3:0>(transmit data): TXD 由 RS 驱动,同步于 TX_CLK,在 TX_CLK 的时钟周期内,并且TX_EN 有效,TXD 上的数据被 PHY 接收,否则 TXD 的数据对 PHY 没有任何影响。
-
TX_EN: 发送使能。TX_EN 由 Reconciliation 子层根据 TX_CLK 上升沿同步进行转换。
-
TX_CLK(transmit clock): TX_CLK (Transmit Clock) 是一个连续的时钟信号(即系统启动,该信号就一直存在),它是 TX_EN、TXD、TX_ER(信号方向为从 RS 到 PHY)的参考时钟,TX_CLK 由 PHY 驱动 TX_CLK 的时钟频率是数据传输速率的 25%,偏差 ±100ppm。例如,100Mb/s 模式下,TX_CLK 时钟频率为 25MHz,占空比在 35% 至 65% 之间。
-
COL(collision detected): COL 不需要同步于参考时钟。The behavior of the COL signal is unspecified when the duplex mode bit0.8 inthe control register is set to a logic one(自动协商禁止,人工设为全双工模式), or when the Auto-Negotiation process selects a full duplex mode of operation。即半双工模式信号有效,全双工模式信号无效。
-
RXD<3:0>(receive data): RXD由RS驱动,同步于 RX_CLK,在 RX_CLK 的时钟周期内,并且 RX_DV 有效,RXD 上的数据被RS 接收,否则 RXD 的数据对 RS 没有任何影响。While RX_DV is de-asserted, the PHY may provide a False Carrier indication by asserting the RX_ER signal while driving the value <1110> onto RXD<3:0>。
-
RX_ER(receive error): RX_ER 同步于 RX_CLK,其在 RX 通道中的作用类似于 TX_ER 对于 TX 通道数据传输的影响。
-
RX_CLK: 它与 TX_CLK 具有相同的要求,所不同的是它是 RX_DV、RXD、RX_ER(信号方向是从 PHY 到 RS)的参考时钟。RX_CLK 同样是由 PHY 驱动,PHY 可能从接收到的数据中提取时钟 RX_CLK,也有可能从一个名义上的参考时钟(e.g., the TX_CLK reference)来驱动RX_CLK。
-
CRS****(carrier sense): CRS 不需要同步于参考时钟,只要通道存在发送或者接收过程,CRS 就需要有效。The behavior of the CRS signal is unspecified when the duplex mode bit0.8 inthe control register is set to a logic one(自动协商禁止,人工设为全双工模式), or when the Auto-Negotiation process selects a full duplex mode of operation,即半双工模式信号有效,全双工模式信号无效。
-
RX_DV(Receive Data Valid): RXD_DV 同步于 RX_CLK,被 PHY 驱动,它的作用如同于发送通道中的 TX_EN,不同的是在时序上稍有一点差别:为了让数据能够成功被RS接收,要求RXD_DV有效的时间必须覆盖整个 FRAME 的过程,即starting no later than the Start Frame Delimiter (SFD) and excluding any End-of-Frame delimiter。 MII以4位半字节方式传送数据双向传输,时钟速率25MHz。其工作速率可达100Mb/s。
-
MII 管理接口: 是个双信号接口,通过管理接口,MAC 就能监视和控制 PHY。其管理是使用 SMI(Serial Management Interface) 总线通过读写 PHY 的寄存器来完成的。一个是时钟信号(MDC (management data clock))。另一个是数据信号(MDIO (management data input/output__))。
-
MDC****: 由站管理实体向 PHY 提供,作为在 MDIO 信号上传送信息的定时参考。 MDC 是一种非周期性的信号,没有最高或最低时间。 无论 TX_CLK 和 RX_CLK 的标称周期如何,MDC 的最小高低时间应为 160 ns,MDC 的最小周期为 400 ns。
-
MDIO****: 是 PHY 和 STA 之间的双向信号。 它用于在 PHY 和 STA 之间传输控制信息和状态。 控制信息由 STA 同步地针对 MDC 驱动并且由 PHY 同步地采样。 状态信息由 PHY 针对 MDC 同步驱动并由 STA 同步采样。
PHY 里面的部分寄存器是 IEEE 定义的,这样PHY把自己的目前的状态反映到寄存器里面。
MAC 通过 SMI 总线不断的读取PHY 的状态寄存器以得知目前 PHY 的状态。例如连接速度、双工的能力等。
当然也可以通过 SMI 设置 PHY的寄存器达到控制的目的。例如流控的打开关闭、自协商模式还是强制模式等。
不论是物理连接的MII总线和 SMI 总线,还是 PHY 的状态寄存器和控制寄存器都是由IEEE的规范的。因此不同公司的 MAC 和 PHY 一样可以协调工作。当然为了配合不同公司的 PHY 的自己特有的一些功能,驱动需要做相应的修改。
MII 支持 10Mbps 和 100Mbps 的操作,一个接口由 14 根线组成,它的支持还是比较灵活的。
但是有一个缺点是因为它一个端口用的信号线太多,如果一个 8 端口的交换机要用到 112 根线,16 端口就要用到 224 根线,到 32 端口的话就要用到 448 根线。
一般按照这个接口做交换机是不太现实的。所以现代的交换机的制作都会用到其它的一些从 MII 简化出来的标准,比如 RMII、SMII、GMII等。
一、什么是RMII
简化媒体独立接口是标准的以太网接口之一,比 MII 有更少的 I/O 传输。RMII 口是用两根线来传输数据的,MII 口是用 4 根线来传输数据的,GMII 是用 8 根线来传输数据的。MII/RMII 只是一种接口,对于10Mbps 线速,MII 的时钟速率是 2.5MHz 就可以了,RMII 则需要 5MHz;对于 100Mbps 线速,MII 需要的时钟速率是 25MHz,RMII 则是 50MHz。
MII/RMII 用于传输以太网包,在 MII/RMII 接口是 4/2bit 的,在以太网的PHY里需要做串并转换,编解码等才能在双绞线和光纤上进行传输,其帧格式遵循IEEE 802.3(10M)/IEEE 802.3u(100M)/IEEE 802.1q(VLAN)。
以太网帧的格式为:前导符 + 开始位 + 目的 mac 地址 + 源 mac 地址 + 类型/长度 + 数据 + padding(optional) + 32bitCRC。如果有 vlan,则要在类型/长度后面加上 2 个字节的 vlan tag,其中 12bit 来表示vlan id,另外,4bit 表示数据的优先级!
二、什么是GMII
GMII是千兆网的MII接口,这个也有相应的RGMII接口,表示简化了的GMII接口。GMII 采用 8 位接口数据,工作时钟125MHz,因此传输速率可达 1000Mbps。同时兼容 MII 所规定的10/100 Mbps工作方式。GMII 接口数据结构符合IEEE以太网标准,该接口定义见 IEEE 802.3-2000。
td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}| 信号名称 | 描述 | 方向 |
| GTX_CLK | 1000M发送时钟 | MAC → PHY |
| TX_CLK | 100/10M发送时钟 | MAC → PHY |
| TX_ER | 发送数据错误 | MAC → PHY |
| TX_EN | 发送使能 | MAC → PHY |
| TX_[7:0] | 发送数据8bit | MAC → PHY |
| RX_CLK | 接收时钟 | PHY → MAC |
| RX_DV | 接收数据有效 | PHY → MAC |
| RX_ER | 接收数据错误 | PHY → MAC |
| RX_[7:0] | 接收数据8bit | PHY → MAC |
| CRS | 载波监测 | PHY → MAC |
| COL | 冲突碰撞监测 | PHY → MAC |
| MDIO | 管理数据 | 双向 |
| MDC | 管理数据时钟 | MAC → PHY |
三、RGMII**
RGMII(Reduced Gigabit Media Independant Interface),精简GMII接口。相对于GMII相比,RGMII具有如下特征:
-
发送/接收数据线由8条改为4条
-
TX_ER和TX_EN复用,通过TX_CTL传送
-
RX_ER与RX_DV复用,通过RX_CTL传送
-
1 Gbit/s速率下,时钟频率为125MHz
-
100 Mbit/s速率下,时钟频率为25MHz
-
10 Mbit/s速率下,时钟频率为2.5MHz
信号定义如下:
| 信号名称 | 描述 | 方向 |
| TXC | 发送时钟 | MAC→PHY |
| TX_CTL | 发送数据控制 | MAC → PHY |
| TXD[3:0] | 发送数据4bit | MAC → PHY |
| RXC | 接收时钟 | PHY → MAC |
| RX_CTL | 接收数据控制 | PHY → MAC |
| RXD[3:0] | 接收数据4bit | PHY → MAC |
| MDIO | 管理数据 | 双向 |
| MDC | 管理数据时钟 | MAC → PHY |
虽然RGMII信号线减半,但TXC/RXC时钟仍为125Mhz,为了达到1000Mbit的传输速率,TXD/RXD信号线在时钟上升沿发送接收GMII接口中的TXD[3:0]/RXD[3:0],在时钟下降沿发送接收TXD[7:4]/RXD[7:4],并且信号TX_CTL反应了TX_EN和TX_ER状态,即在TXC上升沿发送TX_EN,下降沿发送TX_ER,同样的道理试用于RX_CTL,下图为发送接收的时序:
SMI
SMI:串行管理接口(Serial Management Interface),通常直接被称为MDIO接口(Management Data Input/Output Interface)。MDIO最早在IEEE 802.3的第22卷定义,后来在第45卷又定义了增强版本的MDIO,其主要被应用于以太网的MAC和PHY层之间,用于MAC层器件通过读写寄存器来实现对PHY层器件的操作与管理。
MDIO主机(即产生MDC时钟的设备)通常被称为STA(Station Management Entity),而MDIO从机通常被称为MMD(MDIO Management Device)。通常STA都是MAC层器件的一部分,而MMD则是PHY层器件的一部分。
MDIO接口包括两条线,MDIO和MDC,其中MDIO是双向数据线,而MDC是由STA驱动的时钟线。MDC时钟的最高速率一般为2.5MHz,MDC也可以是非固定频率,甚至可以是非周期的。MDIO接口只是会在MDC时钟的上升沿进行采样,而并不在意MDC时钟的频率(类似于I2C接口)。如下图所示。

MDIO接口有两个版本,通常被称为卷22版本和卷45版本。卷22版本的MDIO接口最多支持连接32个MMD(PHY层设备),每个设备最多支持32个寄存器。卷45版本的MDIO接口最多支持连接32个MMD,32个设备类型,每个设备最多支持64K个寄存器。卷22版本的MDIO接口的数据帧格式如下:
具体每个bit描述如下:
卷45版本的MDIO接口的数据帧格式如下:
具体每个bit的描述如下:
如果是STA(MAC层设备)驱动MDIO,则MDIO相对于MDC上升沿,至少要有10ns的建立时间(Setup Time)和10ns的保持时间(Hold Time)。如下图所示:
如果MDIO是由MMD(PHY层设备)驱动的,则MDIO相对于MDC的Tco(Clock to Output Delay)的范围是0ns~300ns。如下图所示:
实际上,MDC的频率也并非一定是小于或等于2.5MHz,比如Marvell的88E1512最大支持12MHz的MDC:

IEEE 802.3建议同时对MDIO进行下拉(下拉电阻建议为2k欧姆+5%),和上拉(上拉电阻建议为1.5k欧姆+5%),使得在TA时,MDIO处于中间态。但是并非所有的PHY器件都有这样的要求,比如Marvell的88E1512只要求对MDIO进行上拉即可,上拉电阻范围为1.5k~10kΩ。
QA
-
网卡的MAC和PHY****间的关系?
网卡工作在osi的最后两层,物理层和数据链路层,物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口.物理层的芯片称之为PHY.
数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能.以太网卡中数据链路层的芯片称之为MAC控制器.
很多网卡的这两个部分是做到一起的.他们之间的关系是pci总线接mac总线,mac接phy,phy接网线(当然也不是直接接上的,还有一个变压装置).
-
网卡****上除RJ-45接口外,还需要其它元件吗?
PHY和MAC是网卡的主要组成部分,网卡一般用RJ-45插口,10M网卡的RJ-45插口也只用了1,2,3,6四根针,而100M或1000M网卡的则是八根针都是全的.
除此以外,还需要其它元件,因为虽然PHY提供绝大多数模拟支持,但在一个典型实现中,仍需外接6,7只分立元件及一个局域网绝缘模块.绝缘模块一般采用一个1:1的变压器.这些部件的主要功能是为了保护PHY免遭由于电气失误而引起的损坏.
另外,一颗CMOS制程的芯片工作的时候产生的信号电平总是大于0V的(这取决于芯片的制程和设计需求),但是这样的信号送到100米甚至更长的地方会有很大的直流分量的损失.而且如果外部网线直接和芯片相连的话,电磁感应(打雷)和静电,很容易造成芯片的损坏.再就是设备接地方法不同,电网环境不同会导致双方的0V电平不一致,这样信号从A传到B,由于A设备的0V电平和B点的0V电平不一样,这样会导致很大的电流从电势高的设备流向电势低的设备.
为了解决以上问题Transformer(隔离变压器)这个器件就应运而生.它把PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到连接网线的另外一端.这样不但使网线和PHY之间没有物理上的连接而换传递了信号,隔断了信号中的直流分量,还可以在不同0V电平的设备中传送数据.
隔离变压器本身就是设计为耐2KV~3KV的电压的.也起到了防雷感应(我个人认为这里用防雷击不合适)保护的作用.有些朋友的网络设备在雷雨天气时容易被烧坏,大都是PCB设计不合理造成的,而且大都烧毁了设备的接口,很少有芯片被烧毁的,就是隔离变压器起到了保护作用.
隔离变压器本身是个被动元件,只是把PHY的信号耦合了到网线上,并没有起到功率放大的作用.那么一张网卡信号的传输的最长距离是谁决定的呢?
一张网卡的传输最大距离和与对端设备连接的兼容性主要是PHY决定的.但是可以将信号送的超过100米的PHY其输出的功率也比较大,更容易产生EMI的问题.这时候就需要合适的Transformer与之配合.作PHY的老大公司Marvell的PHY,常常可以传送180~200米的距离,远远超过IEEE的100米的标准.
RJ-45的接头实现了网卡和网线的连接.它里面有8个铜片可以和网线中的4对双绞(8根)线对应连接.其中100M的网络中1,2是传送数据的,3,6是接收数据的.1,2之间是一对差分信号,也就是说它们的波形一样,但是相位相差180度,同一时刻的电压幅度互为正负.这样的信号可以传递的更远,抗干扰能力强.同样的,3,6也一样是差分信号.
网线中的8根线,每两根扭在一起成为一对.我们制作网线的时候,一定要注意要让1,2在其中的一对,3,6在一对.否则长距离情况下使用这根网线的时候会导致无法连接或连接很不稳定.
现在新的PHY支持AUTO MDI-X功能(也需要Transformer支持).它可以实现RJ-45接口的1,2上的传送信号线和3,6上的接收信号线的功能自动互相交换.有的PHY甚至支持一对线中的正信号和负信号的功能自动交换.这样我们就不必为了到底连接某个设备需要使用直通网线还是交叉网线而费心了.这项技术已经被广泛的应用在交换机和SOHO路由器上.
在1000Basd-T网络中,其中最普遍的一种传输方式是使用网线中所有的4对双绞线,其中增加了4,5和7,8来共同传送接收数据.由于1000Based-T网络的规范包含了AUTOMDI-X功能,因此不能严格确定它们的传出或接收的关系,要看双方的具体的协商结果.
一片网卡主要功能的实现就基本上是上面这些器件了.
其他的,还有一颗EEPROM芯片,通常是一颗93C46.里面记录了网卡芯片的供应商ID,子系统供应商ID,网卡的MAC地址,网卡的一些配置,如SMI总线上PHY的地址,BOOTROM的容量,是否启用BOOTROM引导系统等东西.
很多网卡上还有BOOTROM这个东西.它是用于无盘工作站引导操作系统的.既然无盘,一些引导用必需用到的程序和协议栈就放到里面了,例如RPL,PXE等.实际上它就是一个标准的PCI ROM.所以才会有一些硬盘写保护卡可以通过烧写网卡的BootRom来实现.其实PCI设备的ROM是可以放到主板BIOS里面的.启动电脑的时候一样可以检测到这个ROM并且正确识别它是什么设备的.AGP在配置上和PCI很多地方一样,所以很多显卡的BIOS也可以放到主板BIOS里面.这就是为什么板载的网卡我们从来没有看到过BOOTROM的原因.
最后就是电源部分了.大多数网卡现在都使用3.3V或更低的电压.有的是双电压的.因此需要电源转换电路.
而且网卡为了实现Wake on line功能,必须保证全部的PHY和MAC的极少一部分始终处于有电的状态,这需要把主板上的5V Standby电压转换为PHY工作电压的电路.在主机开机后,PHY的工作电压应该被从5V转出来的电压替代以节省5V Standby的消耗.(许多劣质网卡没有这么做).
有Wake on line功能的网卡一般还有一个WOL的接口.那是因为PCI2.1以前没有PCI设备唤醒主机的功能,所以需要着一根线通过主板上的WOL的接口连到南桥里面以实现WOL的功能.新的主板合网卡一般支持PCI2.2/2.3,扩展了PME#信号功能,不需要那个接口而通过PCI总线就可以实现唤醒功能.
我们现在来看两个图
MAC和PHY分开的以太网卡
MAC和PHY集成在一颗芯片的以太网卡
上图中各部件为:
①RJ-45接口
②Transformer(隔离变压器)
③PHY芯片
④MAC芯片
⑤EEPROM
⑥BOOTROM插槽
⑦WOL接头
⑧晶振
⑨电压转换芯片
⑩LED指示灯
网卡的功能主要有两个:一是将电脑的数据封装为帧,并通过网线(对无线网络来说就是电磁波)将数据发送到网络上去;二是接收网络上其它设备传过来的帧,并将帧重新组合成数据,发送到所在的电脑中.网卡能接收所有在网络上传输的信号,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃.然后,传送到系统CPU做进一步处理.当电脑发送数据时,网卡等待合适的时间将分组插入到数据流中.接收系统通知电脑消息是否完整地到达,如果出现问题,将要求对方重新发送.
-
PHY和MAC****之间如何进行沟通
通过IEEE定义的标准的MII/GigaMII(Media Independed Interfade,介质独立界面)界面连接MAC和PHY。这个界面是IEEE定义的。MII界面传递了网络的所有数据和数据的控制。
而MAC对PHY的工作状态的确定和对PHY的控制则是使用SMI(Serial Management Interface)界面通过读写PHY的寄存器来完成的。PHY里面的部分寄存器也是IEEE定义的,这样PHY把自己的目前的状态反映到寄存器里面,MAC通过SMI总线不断的读取PHY的状态寄存器以得知目前PHY的状态,例如连接速度,双工的能力等。当然也可以通过SMI设置PHY的寄存器达到控制的目的,例如流控的打开关闭,自协商模式还是强制模式等。
我们看到了,不论是物理连接的MII界面和SMI总线还是PHY的状态寄存器和控制寄存器都是有IEEE的规范的,因此不同公司的MAC和PHY一样可以协调工作。当然为了配合不同公司的PHY的自己特有的一些功能,驱动需要做相应的修改。
一片网卡主要功能的实现就基本上是上面这些器件了。
其他的,还有一颗EEPROM芯片,通常是一颗93C46。里面记录了网卡芯片的供应商ID、子系统供应商ID、网卡的MAC地址、网卡的一些配置,如SMI总线上PHY的地址,BOOTROM的容量,是否启用BOOTROM引导系统等东西。
很多网卡上还有BOOTROM这个东西。它是用于无盘工作站引导操作系统的。
既然无盘,一些引导用必需用到的程序和协议栈就放到里面了,例如RPL、PXE等。实际上它就是一个标准的PCI ROM。所以才会有一些硬盘写保护卡可以通过烧写网卡的BootRom来实现。
其实PCI设备的ROM是可以放到主板BIOS里面的。启动电脑的时候一样可以检测到这个ROM并且正确识别它是什么设备的。AGP在配置上和PCI很多地方一样,所以很多显卡的BIOS也可以放到主板BIOS里面。这就是为什么板载的网卡我们从来没有看到过BOOTROM的原因。

浙公网安备 33010602011771号