lab11 net

news2024/11/25 3:48:47

image-20230830133205600

background

  1. 在开始写代码之前,回顾一下xv6book的第五章会有帮助
  2. 你将使用E1000去处理网络通信
    1. E1000会和qemu模拟的lan通信
    2. 在qemu模拟的lan中
      1. xv6的地址是10.0.2.15
      2. qemu模拟的计算机的地址是10.0.2.2
  3. qemu会将所有的网络包都记录在packets.pcap
  4. 文件kernel/e1000.c包含了E1000的初始化代码,以及你需要补充的接收和发送的空函数
  5. kernel/e1000_dev.h包含了寄存器和标志位的定义
  6. kernel/net.ckernel/net.h包含了一个简单的内核栈去实现IP,UDP,ARP协议。这些文件也包含了一个灵活的数据结构去持有packet,叫作mbuf

your job

  1. 完成kernel/e1000.c中的e1000_transmit()e1000_recv()

简单捋一下实验的思路

  1. 首先,我们要修改的是设备驱动,也就是内核层面的代码,它会和硬件设备协同完成数据包的发送和接受
  2. 发送数据包时
    1. 内核只需要将已经准备好的mbuf放到一个缓冲数组中,就完事了。这就是缓冲数组的优点,我往里面一扔就行了
    2. 网卡中应该也有固定的程序,它会自己讲缓冲数组的数据包给发送出去
    3. 我们只需要完成1中的任务,网卡那边不需要我们管
  3. 接受数据包时
    1. 当网卡接收了数据时,它会将它存入另一个缓冲数组,存好之后它们通过一个中断,告诉内核来收数据了
    2. 内核只需要将这个缓冲数组中已经到达的数据包传递给上层应用即可

以上就是基本的交互框架,但是因为设备驱动是内核,是纯软件,而网卡设备是硬件,所以双方的交互就有点麻烦。这里通过了一个很神奇的操作,就是寄存器映射,将硬件的寄存器给映射到了内核的地址空间中,我们访问内核的某个地址,就是在访问硬件的寄存器,这一下子就打通了内核和硬件之间的桥梁

e1000_init中,就将寄存器映射的起始地址赋值给了regs,并且将各种信息和地址都存放到寄存器中,比如数组tx_ring的地址就放到了regs[E1000_TDBAL] = (uint64)tx_ring;

至此,准备工作就做完了,我们现在就需要增加内核代码,使其能够和网卡配合,完成数据报的发送和接受

hints:e1000_transmit

这个lab很有意思,它的hints基本就是给了你所有的伪代码,你一个一个去实现就行了

  1. 首先,让我们通过E1000_TDT为索引去regs取出当前的index,其中regs就是一个uint类型的数组的头指针
  2. 判断这个index指向的buf的状态,通过这个index去tx_ring中取出des,状态就存于des里的status中。这里要和一个宏E1000_TXD_STAT_DD相与进行判断
  3. 如果这个buf还存着之前的值,将它通过mbuffree给free掉
  4. 按提示修改des的各种参数,并且当前buf修改为传入的参数m即可。其中des的cmd参数没有给出提示,估计是想让我们自己查手册,我直接抄了大佬的E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS
  5. 最后,更新寄存器的值(空闲buf的指针,也就是第1步取出来东西的那个寄存器)

这里有个注意点就是,需要在函数首尾加锁。因为同一时刻,可能有多个进程想要通过网卡发送数据,这就形成了竞争的问题

int e1000_transmit(struct mbuf *m) {
    //
    // Your code here.
    //
    // the mbuf contains an ethernet frame; program it into
    // the TX descriptor ring so that the e1000 sends it. Stash
    // a pointer so that it can be freed after sending.
    //
    acquire(&e1000_lock);

    uint32 index = regs[E1000_TDT];
    struct tx_desc *des = &tx_ring[index];

    if (!(des->status & E1000_TXD_STAT_DD)) {
        release(&e1000_lock);
        return -1;
    }

    if (tx_mbufs[index]) {
        mbuffree(tx_mbufs[index]);
    }

    des->addr = (uint64)m->head;
    des->length = m->len;
    des->cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS;
    tx_mbufs[index] = m;

    regs[E1000_TDT] = (regs[E1000_TDT] + 1) % TX_RING_SIZE;

    release(&e1000_lock);
    return 0;
}

hints:e1000_recv

  1. 首先通过寄存器中E1000_RDT的值+1对RX_RING_SIZE取模获取待接收数据的索引
  2. 判断这个索引指向的buf的状态是否是待接收
  3. 如果是待接收,修改m->len并且通过net_rx将这个buf传递给上层
  4. 通过mbufalloc在这个索引处再次新建一个buf,并且将这个buf的des的data指针指向这个buf的head,然后将状态设置为0
  5. 最后将这个索引的寄存器的值+1,

这里有两个注意点

  1. 不需要加锁,因为这里给出了提示。如果这个函数没有运行完,那么不会产生另一个中断
void e1000_intr(void) {
    // tell the e1000 we've seen this interrupt;
    // without this the e1000 won't raise any
    // further interrupts.
    regs[E1000_ICR] = 0xffffffff;

    e1000_recv();
}
  1. 需要使用while循环,把能读的数据包都读出来。我猜是因为一次中断不一定代表只有一个数据包到了,甚至在处理中断的过程中,还会有数据包到。如果每次中断只读一个,会导致丢很多包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS左右上角斜标签】CSS实现左右上角飘带功能,左右上角斜标签(附源码)

文章目录 写在前面涉及知识点实现效果1、实现过程1.1左上角飘带Html代码Css代码效果 1.2右上角飘带Html代码Css代码效果 2、源码分享2.1 百度网盘2.2 123网盘2.3 邮箱留言 总结 写在前面 其实在公司页面开发过程就遇到过,需要在方块右上角展示一个斜的文字或者告警…

gitee上传本地项目bug

🤮这个破bug不知道浪费了多长时间,以前没有记录,每次都忘记,这次记下来 问题描述 gitee创建仓库,然后根据它提示的如下命令,但一直报错 原因分析: 把命令复制出来,粘贴到Sublime …

印尼语翻译,如何提升翻译质量

据了解,印尼是东南亚地区的重要国家,与中国有着密切的经济联系。随着中印两国经贸合作的日益加深,印尼语翻译需求也越来越大。那么,印尼语翻译有什么特点,如何提升印尼语翻译质量? 业内人士指出&#xff0c…

百度百科词条怎么更新?怎么能顺利更新百科词条?

企业和个人百度百科词条的更新对于他们来说都具有重要的意义,具体如下: 对企业来说: 塑造品牌形象:百度百科是一个常被用户信任并参考的知识平台,通过更新企业词条可以提供准确、全面的企业信息,帮助企业塑…

8种最常用的3D CAD中性格式

CAD(计算机辅助设计)文件是包含物理对象 3D 和 2D 模型的数字文件。 CAD 文件可以包含几何数据、制造数据、材料属性和其他产品/过程数据等信息。 从设计到生产,一切都从 CAD 文件开始。 推荐:用 NSDT编辑器 快速搭建可编程3D场…

vue项目中使用开源Vditor

Vditor 是一款所见即所得编辑器,支持 Markdown。 支持多种前端框架 这里介绍在vue中使用包括编辑所见即所得模式,以及仅仅预览展示 更多细节和用法请参考 Vditor - 浏览器端的 Markdown 编辑器,谢谢 ❤️ 所见即所得(编辑预览状…

Windows安装6s模型

官网给出了详细的安装步骤 第一步:安装编译器 安装GnuWin32,按照提示安装,安装到你想安装的地方,记住目录。 安装G77,下载链接里面的Fort99.zip,将G77文件夹提取到C盘根目录。 将这两个目录的bin目录添加…

低代码/无代码平台:加速应用开发的工具

在数字化时代,软件应用已经成为企业和组织不可或缺的一部分。然而,传统的应用开发过程往往需要大量的时间、资源和专业知识。为了解决这个问题,低代码/无代码平台应运而生,它们为开发者提供了一种更快速、更简便的应用开发方式。本…

Spring Security注销后未正确保存空的SecurityContext漏洞CVE-2023-20862

文章目录 0.前言漏洞Spring Security介绍 1.参考文档2.基础介绍3.解决方案3.1. 升级版本3.2. 临时替代方案 4.Spring Security使用教程简单代码示例 0.前言 背景:公司项目扫描到 Spring-security 组件 注销后未正确保存空的SecurityContext CVE-2023-20862 漏洞 高…

基于 Docker 的 MySQL 主从复制搭建(Mac M1版本)

系统:Macbook M1 镜像版本:mysql:5.7 如果是要查 slave连接不上 master的问题,可以直接跳到文章末尾踩坑处 准备工作 拉取镜像 docker pull mysql:5.7本地数据卷挂载 因为mysql不挂载的话,重启丢失数据,所以在本地创…

低价监测的必要性

当品牌线上数据变多时,监测工作就变得非常重要了,品牌的线上监测工作,一般是围绕价格进行的,监测价格有无低价,也是看渠道是否健康的一种体现,当品牌线上渠道存在很多低价链接时,品牌要及时的进…

得物一面,场景题问得有点多!

题目来源:https://www.nowcoder.com/discuss/525371909735792640 前文 本期是【捞捞面经】系列文章的第 1 期,持续更新中…。 《捞捞面经》系列正式开始连载啦,据说看了这个系列的朋友都拿到了大厂offer~ 欢迎星标订阅,持续更新…

数据艺术:精通数据可视化的关键步骤

数据可视化是将复杂数据转化为易于理解的图表和图形的过程,帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础,本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏,接下来跟随小编的思路走起来~ 1.数据收集和…

电商API数据共享(淘宝拼多多京东1688阿里巴巴国际站Lazada)

国内外主流电商平台二十多个,商品数据订单数据买家卖家数据齐全,支持高并发请求 测试API列表 获取api_key&secret 阿里巴巴国际站商品详情数据 "item": {"num_iid": "60840463360","title": "Slip-o…

v-if v-else v-else-if 例子

v-if v-else v-else-if 例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

便携式水质自动采样器可应用的场景

便携式水质自动采样器符合中国环境保护部HJ/T 372-2007《水质自动采样器技术要求及检测方法》&#xff0c;是集流量测量、水样采集&#xff0c;自动分瓶、一体的多功能环境监测仪器。 具有体积小&#xff0c;方便移动、操作简捷、环保节能等特点。适用于各级环境监测站、监察机…

nacos的简单使用

配置中心 服务中心 创建用户管理资源 逻辑图 创建用户 创建角色绑定用户 角色下配置资源 文字解释用户、角色、资源的关系 用户和角色是多对多的关系、角色和资源是多对多的关系。作者画图只是单纯画一个用户的

JDBC使用了哪种设计模式

JDK中提供了操作数据库的接口&#xff0c;比如 java.sql.Driver java.sql.Connection java.sql.Statement java.sql.PreparedStatement 不同的数据库厂商提供操作自己数据库的驱动包&#xff0c; 比如mysql public class Driver extends NonRegisteringDriver implements jav…

C++二叉搜索树

C二叉搜索树 二叉搜索树概念二叉搜索树操作结点类的实现中序遍历实现二叉搜索树的插入非递归实现递归实现 二叉搜索树的查找非递归实现递归实现 二叉搜索树的删除非递归实现递归实现 构造函数拷贝构造函数析构函数赋值运算符重载 二叉搜索树的应用二叉搜索树的性能分析 二叉搜索…

MySQL 日志系统

重要日志模块 日志文件bin logredo log**关于循环写入和擦除的checkpoint 规则**redo log 怎么刷入磁盘的 binlog 和 redo log 有什么区别&#xff1f;undo log 日志文件 错误日志&#xff08;error log&#xff09;&#xff1a; 错误日志文件对 MySQL 的启动、运行、关闭过程进…