以太网(Ethernet)是一种计算机局域网组网技术,基于IEEE 802.3标准,它规定了包括物理层的连线、电信号和介质访问层协议。

Ethernet接口的实质是MAC通过MII总线控制PHY的过程。

硬件原理分析

Ethernet网口通常由CPU、MAC和PHY三部分组成,通常用DMA控制器参与网口数据传输,以减轻CPU的负担。有的CPU内部集成MAC控制器,有的则采用外置的MAC芯片。

MII(Media Independent Interface 媒体独立接口)是IEEE 802.3标准定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口。MII数据接口包括分别用于发送器和接收器的两条独立信道,每条信道拥有数据、时钟和控制信号,共16条信号线。MII管理接口即MDIO接口包含一个时钟信号(MDC)和一个数据信号(MDIO),通过管理接口,上层能监视和控制PHY。根据IEEE802.3标准定义,MII管理接口最多支持同时管理32个PHY。

CPU/MAC通过MDIO接口(类似于I2C接口,因此PHY拥有PHY ADDR)管理PHY芯片。

MAC和PHY之间的数据传输接口类型有MII/RMII(Reduced MII)/SMII(Stream MII)/GMII几种,根据传输速率(10M/100M/1000M)又有不同细分,比如千兆GMII/RGMII/SGMII。

MDIO接口类似于I2C,但是时序上有些区别,它的数据帧格式如下:

每个数据帧64位,LSB先发。

PRE_32: 帧前缀(连续的32个bit,均为1)

ST: 起始信号(2个bit,'01')

OP: 操作码(2个bit,'10' - read,'01'-write)

PA5: PHY Addr(5个bit的PHY地址域,因此MDIO最多可以管理32个PHY)

RA5: Reg Addr(5个bit的PHY内部寄存器地址,同理,PHY寄存器最多包含32个寄存器)

TA: Turn-around(状态转换域,2个bit,写操作时,输出'10';读操作时,释放MDIO数据线)

D16: 数据域(16个bit数据域)

MII数据接口

以太网媒体接口类型有MII/RMII/SMII/GMII几种,所有的这些接口都从MII而来,MII(Medium Independent Interface)指不用考虑传输介质类型(铜轴、光纤、电缆等),因为这些传输介质处理的相关工作都由PHY或者MAC芯片实现。MII接口可分为MAC模式和PHY模式,一般说来MAC和PHY对接,但是MAC和MAC也是可以对接的。

MII接口MAC模式

MII接口PHY模式

MII支持10兆和100兆的操作,一个接口由14根线组成(?),它的支持还是比较灵活的,但是有一个缺点是因为它一个端口用的信号线太多,如果一个8端口的交换机要用到112根线,16端口就要用到224根线,到32端口的话就要用到448根线,一般按照这个接口做交换机,是不太现实的,所以现代的交换机的制作都会用到其它的一些从MII简化出来的标准,比如RMII、SMII、GMII等。

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

SMII是由思科提出的一种媒体接口,它有比RMII更少的信号线数目,S表示串行的意思。因为它只用一根信号线传送发送数据,一根信号线传输接受数据,所以在时钟上为了满足100的需求,它的时钟频率很高,达到了125兆,为什么用125兆,是因为数据线里面会传送一些控制信息。SMII一个端口仅用4根信号线完成100信号的传输,比起RMII差不多又少了一倍的信号线。SMII在工业界的支持力度是很高的。同理,所有端口的数据收发都公用同一个外部的125M时钟。

GMII是千兆网的MII接口,这个也有相应的RGMII接口,表示简化了的GMII接口。

SMII用1根线来传输数据,RMII用2根线来传输数据,MII用4根线来传输数据,GMII用8根线来传输数据,GMII和RMII都是并行传输且需要随路时钟。

特别介绍一下SGMII(Serial Gigabit Media Independent Interface),它通常用于GEMAC(Gigabit Ethernet Media Access Controller)即千兆以太网MAC控制器,它是基于GMII实现的,原理是GMII+Serdes,即引入Serdes技术实现串并转换,从而减少数据线的个数。

软件架构和驱动代码分析

按照OSI七层协议,MAC工作在数据链路层,PHY工作在物理层。在Linux网络子系统中,IP层、TCP/UDP层及其上的应用层均为软件实现,由内核协议栈和用户态socket代码实现。

网卡驱动的初始化流程可以归纳为:

1)为网络数据收发分配内存(或者更进一步配置DMA直接内存存取)

2)初始化MDIO控制器和MAC控制器

3)通过MDIO接口初始化PHY控制器

4)注册内核网络协议栈接口

5)启动收发

linux 网卡驱动构架,Linux网卡驱动分析相关推荐

  1. 6.S081 lab: networking e1000 网卡驱动 附 Linux 网卡驱动编写分析

    本文是 6.S081 操作系统课程学习最后一个 lab,编写一个 intel 的 e1000 网卡的驱动在 xv6 下.需要复习知识有:操作系统知识,计算机组成原理 DMA 相关,循环缓冲区的概念,e ...

  2. Linux内核学习笔记之网卡驱动的详细分析:RTL8139

    学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难免让 人有心惊胆颤,捉襟见肘的感觉.读Linux网卡驱动也是一样.那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏 ...

  3. linux网卡e1000下载,Linux E1000网卡驱动分析

    本分析主要针对e1000网卡,驱动源码为7.3.20-k2.本文的目的不是为了讲述如何编写驱动程序,主要是分析网卡驱动内部的实现机制. Linux-千兆网卡驱动实现机制浅析 作者: Minit, 出处 ...

  4. 初识Linux Kernel 移植 之 dm9621网卡驱动移植

    初识Linux 驱动移植 -- dm921 概述 配置内核 dm9621 网卡驱动编译配置选项 问题探索 读 dm9621 MAC 地址失败 网卡反复断开重连 概述 将kernel移植到开发板并能正常 ...

  5. 以太网卡驱动程序移植linux,基于S3C2440的DM9000网卡驱动的移植

    摘  要: 主要研究了基于Linux内核的网卡驱动的移植.Linux网络设备驱动程序的体系结构可以分为4层,首先分析了各层的具体功能实现,并在此基础上充分利用S3C2440开发板完成DM9000网卡驱 ...

  6. 十九、Linux驱动之虚拟网卡驱动

    1. 基本概念 网络设备是完成用户数据包在网络媒介上发送和接收的设备,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议.与字符设备和块设备不同,网络设备并 ...

  7. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...

    2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...

  8. linux+网卡驱动社区,Linux下如何确定网卡所使用的驱动程序

    有些时候你可能想知道某个Linux系统的网卡正在使用什么驱动程序,下面简单介绍下如何解决这个问题. 1. 无论是集成网卡还是独立的网卡,都必须通过某种方式连接到PCI总线上,这样的话,必定有有一个代号 ...

  9. r8169驱动下载linux,CentOS自带R8169驱动与R8168网卡之间的烦恼

    前几周我装了5台高性能PC机用来性能测试,网卡是板载的并没有太在意.这周开始做测试了,开始跑测试程序的时候总出问题,没跑一会儿服务器就卡死了.开始开发的同事以为是测试程序的问题,开始从头到尾找问题(多 ...

最新文章

  1. 维基链锚定行业缺口,定位发展一体化DeFi,持续开发出各类产品应用,包括去中心化抵押借贷系统Wayki-CDP(含稳定币WUSD)、去中心化交易所Wayki-DEX、去中心化合成资产协议Wayki-X
  2. php mysql 时间戳查询_mysql中时间查询函数(包括时间戳)
  3. 算法/数据工程师必备技能
  4. 零基础入门Python I/O:从print函数开始
  5. php 抽象类 静态 单体设计模式
  6. tf.nn.rnn_cell.DropoutWrapper用法细节案例1
  7. c语言输出菱形for循环_C语言如何输出菱形
  8. 谷歌浏览器屏蔽广告插件
  9. 一个VSCode插件实现软妹音程序员鼓励师24小时在线,还能吐槽PM
  10. TMS320F28035 之ECAP捕获频率
  11. CSGO地图人物模型配置
  12. 北邮 计算机网络实验二
  13. 端午节,我们失去的太多了
  14. 风场可视化:绘制轨迹
  15. CreateJS 制作 H5 长图动画
  16. 阿拉伯数转中文与英文[找到规律,抽象问题,转换成代码]
  17. AD转换器输入之前为何要接一个电压跟随器?
  18. 如何恢复红米手机数据
  19. Android程序员必备的六大顶级开发工具,快加入你的清单!
  20. Verdi非常实用技巧

热门文章

  1. 外综服管理丨外贸综合服务平台解决方案
  2. wsp可以编辑html吗,wps和office兼容吗
  3. maven clean install报系统资源不足
  4. 第九次作业——码流分析仪
  5. DOSBOX运行QBASIC和Turbo PASCAL
  6. std::accumulate
  7. 2007电子杂志的发展必然—企业电子商刊(iebook)!
  8. Arduino模拟简易倒车雷达系统
  9. windows 恢复误删文件
  10. 【jupyter报错】‘nb_conda_kernels.CondaKernelSpecManager‘ could not be imported