Linux Kernel TCP/IP Stack — L1 Layer — Physical NIC
目录
文章目录
- 目录
- 网卡与网卡适配器
- 网卡的组成
- 网卡的工作原理
- 基于 DMA 的 NIC I/O 模型
网卡与网卡适配器
我们知道计算机的输入输出系统由外部硬件设备(e.g. 网卡)及其与主机之间的控制部件(e.g. 网卡驱动)所构成,其中控制部件常被称为设备控制器、设备适配器、设备驱动或 I/O 接口,主要负责控制并实现主机与外设之间的数据传输。
在本文中,网卡指物理网络设备卡、网卡适配器指网卡设备控制器,即安装在操作系统上的网络设备驱动。
网络设备驱动在 Linux 内核中是以内核模块的形式存在的。所以对于网卡驱动的初始化,同样需要提供一个内核模块初始化函数来完成的,初始化网络设备的硬件寄存器、配置 DMA 以及初始化相关内核变量等。
设备初始化函数在内核模块被加载时调用,包括:
- 初始化 PHY 模块,包括设置双工/半双工运行模式、设备运行速率和自协商模式等。
- 初始化 MAC 模块,包括设置设备接口模式等。
- 初始化 DMA 模块,包括建立 BD(Buffer descriptor)表、设置 BD 属性以及给 BD 分配缓存等。
网卡的组成
网卡工作在物理层和数据链路层,主要由 PHY/MAC 芯片、Tx/Rx FIFO、DMA 等组成,其中网线通过变压器接 PHY 芯片、PHY 芯片通过 MII 接 MAC 芯片、MAC 芯片接 PCI 总线。
- PHY 芯片主要负责:CSMA/CD、模数转换、编解码、串并转换。
- MAC 芯片主要负责:
- 比特流和数据帧的转换(7 字节的前导码 Preamble 和 1 字节的帧首定界符 SFD)
- CRC 校验
- Packet Filtering(L2 Filtering、VLAN Filtering、Manageability/Host Filtering)
- Tx/Rx FIFO:Tx 表示发送(Transport),Rx 是接收(Receive)。
- DMA(Direct Memory Access):直接存储器存取 I/O 模块。
网卡的工作原理
Linux 操作系统的功能可以概括为进程管理、内存管理、文件系统管理、设备管理和计算机网络等几部分。所有的操作系统执行最终都可以映射到对物理设备的操作。
除去对 CPU、内存等处理机设备的操作之外,操作系统对其他外部设备的操作都通过专门的驱动程序完成。操作系统的每种外设在内核中都必须有对应的设备驱动程序对其进行处理。所以分析网卡的工作原理即是分析网卡的驱动程序。
网络是独立的一个模块。为了屏蔽物理网络设备的多样性,Linux 内核协议栈实现中,对底层物理设备进行了抽象并定义了一个统一的概念,称之为 Socket 接口。所有对网络硬件的访问都是通过接口完成的,接口提供了一个抽象而统一的操作集合来处理基本数据报文的发送和接收。一个网络接口就被看作是一个发送和接收数据包的实体。
对于每个网络接口,都用一个 net_device 的数据结构来表示。net_device 中有很多提供系统访问和协议层调用的设备方法,包括提供设备初始化和往系统注册用的 init 函数,打开和关闭网络设备的 open 和 stop 函数,处理数据包发送的函数 hard_start_xmit,以及中断处理函数。
所有被发送和接收的数据报文都用 sk_buff 结构表示。
- 要发送数据时,内核网络协议栈将根据系统路由表选择相应的网络接口进行数据传输;
- 当接收数据包时,通过驱动程序注册的中断服务程序进行数据的接口处理。
基于 DMA 的 NIC I/O 模型
以往,从网卡的 I/O 区域,包括 I/O 寄存器或 I/O 内存中读取数据,这都要 CPU 亲自去读,然后把数据放到 RAM 中,也就占用了 CPU 的运算资源。直到出现了 DMA 技术,其基本思想是外设和 RAM 之间开辟直接的数据传输通路。
一般情况下,总线所有的工作周期(总线周期)都用于 CPU 执行程序。DMA 控制就是当外设完成数据 I/O 的准备工作之后,会占用总线的一个工作周期,和 RAM 直接交换数据。这个周期之后,CPU 又继续控制总线执行原程序。如此反复的,直到整个数据块的数据全部传输完毕,从而解放了 CPU。
- 首先,内核在 RAM 中为收发数据建立一个环形的缓冲队列,通常叫 DMA 环形缓冲区,又叫 BD(Buffer descriptor)表。
- 内核将这个缓冲区通过 DMA 映射,把这个队列交给网卡;
- 网卡收到数据,就直接放进这个环形缓冲区,也就是直接放进 RAM 了;
- 然后,网卡驱动向系统产生一个中断,内核收到这个中断,就取消 DMA 映射,这样,内核就直接从主内存中读取数据;
Linux Kernel TCP/IP Stack — L1 Layer — Physical NIC相关推荐
- Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡
目录 文章目录 目录 多队列网卡 Intel 82575 的多队列硬件实现 Intel 82575 的多队列软件驱动实现 多队列网卡识别 多队列网卡 多队列网卡,是一种用来解决网络 I/O QoS 问 ...
- Linux Kernel TCP/IP Stack — L1 Layer — tcpdump 抓包
目录 文章目录 目录 tcpdump CLI 关键字 常用指令选项 常规操作示例 查看哪些接口可用于捕获 过滤主机 过滤端口 过滤网络(网段) 过滤协议 复杂的逻辑表达式过滤条件 检查数据包内容 输出 ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC bonding
目录 文章目录 目录 NIC bonding mode=0(balance-rr,RR 负载均衡策略) mode=1(active-backup,主备策略) mode=2(balance-xor,XO ...
- Linux Kernel TCP/IP Stack — L1 Layer — Network Interface
目录 文章目录 目录 Linux 的网络设备接口 Linux 的虚拟网络设备接口 Linux 的网络设备接口 Network Interface(网络接口)通常是一个硬件设备,也可能是纯软件实现的,例 ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB
目录 文章目录 目录 sk_buff(SKB,Socket Buffer) 收包 发包 sk_buff(SKB,Socket Buffer) Linux 内核中,用 sk_buff 来描述一个数据缓存 ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table
目录 文章目录 目录 DMA 与 Buffer descriptor DMA 与 Buffer descriptor NIC Controller 会在 RAM 中建立并为例两个环形队列,称为 BD ...
- Linux Kernel TCP/IP Stack — L1 Layer
目录 文章目录 目录 Hardware Driver Layer Hardware Driver Layer 提供以下功能: 网络设备管理. 支持各种网卡驱动实现. RPS.RFS.XPS.GRO.G ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — NAPI
目录 文章目录 目录 NAPI 中断方式与轮询方式 NAPI 值得注意的是,传统收包方式是每个报文都会触发中断,如果中断太频繁,CPU 就总是处理中断,其他任务无法得到调度,于是 NAPI(New A ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller
目录 文章目录 目录 输入输出系统 设备控制器 设备控制器的作用 设备适配器的接口类型 设备适配器的基本功能 设备控制器的组成 外设的编址方式 外设数据传输控制方式 程序直接控制方式 程序中断控制方式 ...
最新文章
- cufflinks基于dataframe数据自定义绘图基于df.iplot功能
- 从粒子到宇宙的旅行指南
- Struts 2的文件上传
- 【Demo】配置重试和超时策略
- Java的后缀分类_JAVA根据文件后缀名分类文件,并且将文件复制到不同的文件夹,求这段代码的注释...
- spring security:自定义认证成功处理器
- ap map 脚本_【图片】fgotool辅助脚本:检测各种素材消耗AP最少的前三个地点【命运冠位指定吧】_百度贴吧...
- AspNet MVC2 学习笔记
- Apollo应用接入
- 泛微e9隐藏明细表_泛微协同 泛微OA e-cology产品功能清单 模块列表
- CCL2022 中文语法纠错评测
- 2021寒假MISC打卡DAY1
- python2在线编译器_C/C++/Python在线编译器
- 微信,世界上最成功的私链
- 深入理解Camera 基础知识点
- air换电池 macbook_macbook怎么换电池?macbook换电池图文教程
- maven添加sqljdbc4.jar,并引用
- 5 种最常见的 DNS 故障诊断及问题处理方法
- matlab ifs植物形态,matlab练习程序(IFS分形)
- h5中设置div中的内容水平并垂直居中
热门文章
- SQLite中的WHERE子句
- Swift3.0语言教程使用URL字符串
- numa节点_漫步云端NUMA调度
- 封装 继承 多态_Java基础知识——封装、继承、多态
- 使用游戏测试干式EEG传感器的有效性
- 使用NeMo快速完成NLP中的信息抽取任务,英伟达专家实战讲解,内附代码
- 放张载玻片就能放大一万倍,普通光学显微镜都馋哭了 | Nature子刊
- 旷视唐文斌:你到底给谁创造了什么样的价值?这是AI产品的灵魂拷问丨MEET2020...
- Nature:最强癌基因找到了,居然不在染色体上 | 华人领衔最新研究
- 又一家明星机器人公司倒掉:曾是全球机器人技术50强,主打性价比AI机械臂