e1000收发包分析
前言上次看了 lan9118 收发包过程PIO 模式现代网卡基本千兆cpu直接搬运性能不太行了所以需要DMA开始看带dma的pci千兆网卡了能用qemu跑起来的重点看dma搬运用e1000经过查询发现有个 MIT 的著名操作系统课程 6.828 / 6.S081 的 Lab 就是让学生为 E1000 编写驱动网上有大量可以参考的学习资源就用这个吧vx6 网络实验目标DMA (Direct Memory Access)和描述符环 (Descriptor Ring)vx6 网络实验概念6.828 操作系统课xv6 操作系统做什么在 xv6 教学操作系统上亲手为一个E1000 网卡实现设备驱动。需要完成的核心任务有两个实现发送 (e1000_transmit)实现接收 (e1000_recv) 函数过程https://pdos.csail.mit.edu/6.828/2020/labs/net.html网页是英文但已有不少优秀的前辈做过这个实验还翻译成了中文可以直接搜索参考按照这个网页的步骤里面提供了一些参考资料如vx6的手册e1000的手册可以参考其中的哪些章节我看了然后发现自己还是不会写接收和发送函数于是决定给自己降低难度查找做过这个实验的前辈的代码我的任务是理解代码环境VMwareUbuntu 20.04_64尽量用较新的版本不然risv gcc工具链不太好搞安装库sudo apt install git sudo apt install make sudo apt install gcc sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu sudo apt install vim下载 riscv64-elf-ubuntu-20.04-gcc-nightly-2023.09.27-nightly.tar.gz 这是编译好的二进制解压可以了。太早的版本只能下载源码编译编译尚未成功已放弃解压bin路径加入PATHtar -zxvf riscv64-elf-ubuntu-20.04-gcc-nightly-2023.09.27-nightly.tar.gz export PATH/....../riscv/bin:$PATH下载 vx6源码切到 net 分支git clone git://g.csail.mit.edu/xv6-labs-2020 git checkout net开始编译make clean make qemu然后就报错了user/sh.c:58:1: error: infinite recursion detected [-Werrorinfinite-recursion] 58 | runcmd(struct cmd *cmd) | ^~~~~~修改vim Makefile CFLAGS ... -Wno-infinite-recursion再次 make qumu可以啦xv6 kernel is booting hart 2 starting hart 1 starting init: starting sh $已进入 qemu退出 qemuctrla 松开再按x发包测试在一个终端cd xv6-labs-2020目录运行make server命令这启动了一个服务器程序监听来自 xv6 的 UDP 数据包另一个终端运行make qemu命令来启动 xv6 操作系统进到$后执行nettests命令这会向 IP 地址为10.0.2.2的“主机”发送一个 UDP 数据包。在 QEMU 的虚拟网络里10.0.2.2这个 IP 地址被映射到了真实主机Host。因此xv6 协议栈会调用e1000_transmit()函数来发送这个数据包直接执行是不可能收到回复的因为现在还没有实现发送函数 e1000_transmit()也没有实现 接收函数过程分析相关概念在实际看代码之前先来看些基本概念DMADMA直接内存访问的核心原理CPU 不搬运数据而是将“内存缓冲区地址”和“描述符环”的物理地址告诉网卡网卡内置的 DMA 控制器会通过 PCIe 总线自行读写这些物理内存。mbuf 数据包仓库tx/rx ring 地址簿 描述符发送描述符e1000 手册 3.3.3 表 3.9vx6里的简化相比 linux 内核定义【kernel/e1000_dev.h】 struct tx_desc { uint64 addr; uint16 length; uint8 cso; uint8 cmd; uint8 status; uint8 css; uint16 special; } // [E1000 3.2.3] struct rx_desc { uint64 addr; /* Address of the descriptors data buffer */ uint16 length; /* Length of data DMAed into data buffer */ uint16 csum; /* Packet checksum */ uint8 status; /* Descriptor status */ uint8 errors; /* Descriptor Errors */ uint16 special; };mbuf【kernel/net.h】 struct mbuf { struct mbuf *next; // the next mbuf in the chain char *head; // the current start position of the buffer unsigned int len; // the length of the buffer char buf[MBUF_SIZE]; // the backing store };初始化vx6的代码里提供了初始化函数e1000_init()e1000_init 把tx_ring数组首元素的地址写入 TDBAL ​ 数组长度写入 TDLEN ​ TDH写0 ​ TDT写0这里我就不贴代码了网上能直接搜索到只记录过程。发包过程网卡硬件提供e1000手册3.4​ 发送描述符基地址寄存器 TDBAL​ 发送描述符长度寄存器 TDLEN​ 发送描述符头存器 TDH​ 发送描述符尾存器 TDT软件​ 定义 tx_ring[]​ e1000_init​ 把tx_ring数组首元素的地址写入 TDBAL​ 数组长度写入 TDLEN​ TDH写0​ TDT写0​ 发送函数​ 接收协议栈组装好的 mbuf​ 读TDT知道可用的描述位置即tx_ring数组下标发第1个包是0一次加1​ 用下标在tx_ring数组里取到 描述符 desc​ 检查 desc 里 DD位1表示desc对应的上一个数据包已处理完成完成​ 释放旧的 mbuf​ 用mbuf里的信息填充 desc 数据包的内存地址长度​ mbufer地址保存到 tx_mbufs数组用于下次使用前释放内存​ 更新 TDT硬件​ **网卡硬件内部的状态机FSM**轮询发现 TDT ! TDH​ 从当前TDH指向的位置读取描述符Descriptor的内容地址、长度、CMD 位。​ 解析出addr和length。​ 发起PCIe 读事务DMA 读去内存中读取实际的mbuf数据。​ 数据读回来放入网卡内部的 FIFO再通过网线发出去​回写描述符的status字段: 置位E1000_TXD_STAT_DDDescriptor Done位。收包过程网卡硬件提供​ RDH 硬件下一个要写的位置​接收尾指针寄存器RDT指向的是“驱动已经处理并回填好的最后一个描述符的索引”软件​ 定义 rx_ring[]​ 定义 rx_mbufs[]​ e1000_init​ 把rx_ring数组首元素的地址写入 RDBAL​ 数组长度写入 RDLEN​ RDH写0​ RDT写 RX_RING_SIZE - 1​ 接收函数e1000_intr e1000_recv e1000_recv while(1) 根据 RDT 得到 rx_index 用 rx_index 得到 rx_ring[rx_index] 描述符 判断描述符的 DD //网卡硬件在将数据包 DMA 搬运到内存完成后由网卡硬件自动置 1 的标志位 0 break 1 继续向下执行 用描述符-length 更新 rx_mbufs[rx_index]-len net_rx 把数据 rx_mbufs[rx_index] 给到协议栈 分配新 mbuf 更新 desc-addr 清除 desc-status 0 更新 RDT总结接收包完整过程e1000驱动初始化基址预填所有空仓库​ rx_ring数组首元素的地址写入 RDBAL​ 用mbufalloc()分配好所有空mbuf把它们的物理地址head一个一个填进rx_ring里每个描述符的addr字段。当数据包从网线进入网卡​ 网卡硬件DMA根据RDH找到用rx_ring[]里哪个描述符​ 从描述符里读出物理地址把数据搬运到对应物理地址​ 描述符DD写1中断通知cpucpu用注册好的中断函数处理e1000_intr调用接收函数接收函数​ 传递 **mbuf结构体的指针虚拟地址**给到了协议栈net.c而不是物理地址​ 分配新的mbuf​ 把新mbuf的物理地址填回同一个描述符。​ 清空status去掉DD​更新RDT协议栈​ 通过**mbuf结构体的指针虚拟地址**去读取mbuf-head里面存的才是物理地址但协议栈不需要知道因为 xv6 做了直接映射虚拟地址可以直接加减偏移得到物理地址参考vx6 网络实验 https://pdos.csail.mit.edu/6.828/2020/labs/net.html

相关新闻

std::variant与std::visit:从访问者模式到类型安全联合

std::variant与std::visit:从访问者模式到类型安全联合

访问者&#xff08;Visitor&#xff09;模式想解决的是&#xff1a;有一族结构相对稳定的类型&#xff0c;上面要挂多种易变的操作&#xff08;求值、打印、序列化……&#xff09;&#xff0c;又不想在每个类里无限加成员函数&#xff0c;也不想用一长串 if (dynamic_cast<…

2026/8/18 18:45:03 阅读更多 →
老游戏在Windows 10/11疯狂闪退?这款免费兼容性补丁如何彻底修复游戏崩溃

老游戏在Windows 10/11疯狂闪退?这款免费兼容性补丁如何彻底修复游戏崩溃

老游戏在Windows 10/11疯狂闪退&#xff1f;这款免费兼容性补丁如何彻底修复游戏崩溃 【免费下载链接】SilentPatchBully SilentPatch for Bully: Scholarship Edition (fixes crashes on Windows 10) 项目地址: https://gitcode.com/gh_mirrors/si/SilentPatchBully 周…

2026/8/18 18:45:03 阅读更多 →
QML与C++交互

QML与C++交互

QML 与 C++ 的交互是 Qt Quick 开发的核心需求,常用于将界面逻辑与底层业务逻辑解耦。 一、基础交互机制 元对象系统(Meta-Object System):基于 Qt 的 moc(元对象编译器)生成反射信息,实现 QML 与 C++ 的双向通信,依赖信号槽(Signals & Slots)和属性绑定(Propert…

2026/8/18 18:45:03 阅读更多 →

最新新闻

挪威2万亿美元主权基金欲购8000亿美元OpenAI,是想象力还是空想?

挪威2万亿美元主权基金欲购8000亿美元OpenAI,是想象力还是空想?

挪威主权基金收购OpenAI&#xff1a;2万亿与8000亿的大胆设想Zachary Jones在 _One Thousand Means_ 上提出大胆设想&#xff0c;挪威若用主权基金买下OpenAI会怎样。此设想一出&#xff0c;社区讨论迅速分化。挪威Government Pension Fund Global&#xff08;GPF - G&#xff…

2026/8/19 21:06:52 阅读更多 →
漏洞缓解措施的上下文边界

漏洞缓解措施的上下文边界

漏洞缓解措施的上下文边界 讨论接口契约、数据模型与错误语义设计&#xff0c;关键不是罗列工具&#xff0c;而是回答一个更实际的问题&#xff1a;在 AI 增强型 漏洞利用与缓解绕过&#xff1a;栈/堆溢出、ASLR/DEP 绕过技术剖析&#xff1a;预测建模、异常识别与决策辅助 的当…

2026/8/19 21:06:52 阅读更多 →
电商老板看数据,这3个场景需要3种工具组合——2026年实战指南,你的搭配对了吗?

电商老板看数据,这3个场景需要3种工具组合——2026年实战指南,你的搭配对了吗?

做了几年电商的老板都有同感&#xff1a;看数据这件事&#xff0c;越做越复杂。 日常监控要快、利润分析要准、大促复盘要全——三个场景对数据的要求完全不同。市面上没有一款工具能同时满足这三个场景的全部需求。真正的解法是&#xff1a;不是找一个工具替代所有&#xff0…

2026/8/19 21:06:52 阅读更多 →
推理引擎灰度发布的验证重点

推理引擎灰度发布的验证重点

推理引擎灰度发布的验证重点 发布前先列出不可兼容项 编译器、运行时和模型包往往一起变。灰度前先把兼容矩阵写清&#xff1a;模型格式、算子版本、量化参数、输入张量形状&#xff0c;以及缓存和编译产物是否能复用。每一项都要有“允许混用”或“必须同批切换”的结论&#…

2026/8/19 21:06:52 阅读更多 →
电商管理后台怎么搭建?从商品管理到订单处理的核心模块落地方法

电商管理后台怎么搭建?从商品管理到订单处理的核心模块落地方法

"一个做电商的朋友跟我吐槽&#xff1a;我们公司上了三套系统——ERP管库存、旺店通管订单、财务用Excel做账。三套系统各管各的&#xff0c;数据对不上。上个月财务算出利润80万&#xff0c;运营说只有50万&#xff0c;差了30万谁都不知道错在哪。我说&#xff1a;你不是…

2026/8/19 21:06:52 阅读更多 →
高并发系统设计:从理论到落地的全链路解决方案原创

高并发系统设计:从理论到落地的全链路解决方案原创

高并发系统设计&#xff1a;从理论到落地的全链路解决方案 在互联网业务爆发式增长的背景下&#xff0c;“高并发” 早已不是大厂专属的技术命题。当用户量突破百万、订单峰值达到每秒数万笔时&#xff0c;传统单体架构往往会出现响应延迟、接口超时甚至系统崩溃等问题。本文将…

2026/8/19 21:05:52 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述&#xff1a;当AI开始“猜”数学定理 最近在AI研究圈里&#xff0c;一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思&#xff0c;直译是“月光”&#xff0c;但在数学史上&#xff0c;它特指一个神秘而美丽的联系——魔群月光猜想&#xff0c;连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑&#xff0c;跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/19 11:55:18 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 9:46:27 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/19 5:04:55 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/19 7:42:22 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/19 11:55:13 阅读更多 →