qemu: 设备后端模拟

2023-11-13

目录

 

1. 网卡模拟

2. 网卡参数解析

3. qemu前端虚拟网卡设备创建

4. 报文发送流程

5. 报文发送流程


1. 网卡模拟

参数: 

-netdev type=tap,id=eth0,ifname=tap30,script=no,downscript=no -device e1000,netdev=eth0,mac=12:03:04:05:06:08

-net nic,model=e1000,netdev=eth0 -netdev tap,ifname=tap30,script=no,downscript=no,id=eth0

 

2. 网卡参数解析

解析完的参数放到 QemuOptsList 中

 

net_init_clients:对网卡参数进行初始化,没类参数都有对应的解析函数

-netdev 和 -nic 都调用到 net_client_init

net_client_init,参数保存到 object对象中


net_client_init1,如果是-nic,将legacy转换为netdev,如果-netdev,什么都不做,最后根据 type 统一调用 net_client_init_fun[]

net_client_init_fun[]

net_init_nic

NICInfo: 网卡信息

nd_table, NICInfo和 (netdev) NetClientState 之间的关系

 

net_init_tap

tap_open:打开TAP设备

net_tap_init

net_init_tap_one

net_tap_fd_init

net_tap_info

qemu_new_net_client

qemu_net_client_setup:将新分配的NetClientState挂载到net_clients上

tap_read_poll

tap_update_fd_handler

qemu_set_fd_handler,将fd加入iohandler_ctx进行监听,并设定对应的处理函数

TAP(fd)和TAPState的关系, QEMU的TAP后端

3. qemu前端虚拟网卡设备创建

 

pc_init1->pc_nic_init 建立qemu虚拟网卡

pc_nic_init

pci_nic_init_nofail

qemu_find_nic_model

pci_get_bus_devfn

qdev_set_nic_properties

qdev_prop_set_macaddr

qdev_prop_set_netdev

e1000_properties

DEFINE_NIC_PROPERTIES

DEFINE_PROP_MACADDR

qdev_prop_macaddr

set_mac:把参数中的52:54:00:12:34:56地址,转换为uint8_t a[6];格式

DEFINE_PROP_NETDEV

qdev_prop_netdev

E1000State_st

NICConf

NICPeers,ncs是后端设备(TAP),每个队列对应一个,前端一个虚拟网卡,可以有多个队列

set_netdev

qemu_find_net_clients_except

e1000虚拟网卡和后端TAP设备的关系

pci_nic_init_nofail

qdev_init_nofail

下面进行实例化,e1000为例

net_e1000_info

pci_e1000_realize

qemu_new_nic

qemu_net_client_setup,设置前端incoming queue处理函数为 qemu_deliver_packet_iov,用来从TAP收报到前端设备

e1000 前后端设备关系

创建qemu虚拟网卡前端

pci_e1000_realize

net_init_tap

net_init_tap_one

net_tap_fd_init

NetClientState

NetClientInfo:网卡的注册信息和注册函数

4. 报文发送流程

e1000_send_packet,如果LOOKBACK,用receive收回;如果不是,用qemu_send_packet发送

qemu_send_packet

qemu_send_packet_async

qemu_send_packet_async_with_flags,sender->peer->incoming_queue得到后端的incoming queue进行发送

qemu_net_queue_send

qemu_net_queue_flush

qemu_net_queue_deliver

qemu_deliver_packet_iov:NetClientState *nc = opaque;是后端tap网卡,后端receive_iov接收,等于发送出去

net_tap_info

tap_receive_iov

tap_write_packet

5. 报文发送流程

tap_send:tap_read_packet 从 TAP中读取报文,qemu_send_packet_async 发送报文到qemu前端虚拟设备

set_ics: e1000中断触发函数 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qemu: 设备后端模拟 的相关文章

  • Linux的IO端口和IO内存

    Linux的IO端口和IO内存 分类 linux编程 2011 01 14 13 22 866人阅读 评论 1 收藏 举报 io linux linux内核 struct 平台 x86 CPU对外设端口物理地址的编址方式有两种 一种是IO映
  • 【树莓派】Linux内核编译

    树莓派 Linux内核编译 树莓派的Linux内核编译有两种方法 一种是在树莓派上直接编译 另一种是利用交叉编译的方法 一般我们都推荐采用交叉编译的方式进行编译 这是因为通常交叉编译Pi内核的速度比Pi本身编译快得多 性能因素 下面就讲下如
  • 虚拟化技术-KVM的安装及管理

    1 宿主机环境准备 KVM需要宿主机CPU必须支持虚拟化功能 因此如果是在vmware workstation上使用虚拟机做宿主机 那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能 1 CPU开启虚拟化 硬件 处理器 2核 勾选虚拟
  • qemu 启动自定义文件系统命令

    kvm qemu aarch64 bin qemu system aarch64 M virt smp 8 cpu cortex a76 m 4G nographic kernel out kernel arm64 Image append
  • 38.驱动调试——printk

    printk的用法 mz linux ChinaUnix博客 printk函数的用法 wwwlyj123321的博客 CSDN博客 printk 34 Linux printk分析 使用 FILE FUNCTION LINE 调试 诺谦 博
  • Docker 安装部署与基础操作

    Docker 是一个开源的商业产品 有两个版本 社区版 Community Edition 缩写为 CE 和企业版 Enterprise Edition 缩写为 EE 企业版包含了一些收费服务 个人开发者一般用不到 下面的介绍都针对社区版
  • 半虚拟化和全虚拟化的区别

    全虚拟化 Full virtualization 也称为原始虚拟化技术 是另一种虚拟化方法 该模型使用虚拟机协调客户 操作系统和原始硬件 见图2 这里 协调 是一个关键词 因为VMM在客户操作系统和裸硬件之间用于工作协调 一些受保护的指令必
  • Linux用户空间与内核空间

    Linux用户空间与内核空间 2012 08 30 15 39 1969人阅读 评论 1 收藏 举报 linux linux内核 struct user system allocation Linux 操作系统和驱动程序运行在内核空间 应用
  • sel4白皮书翻译

    首发地址 http trialley top pages 53ac44 CSDN地址 https blog csdn net lgfx21 article details 117606097 翻译与转发许可 作者 Gernot Heiser
  • 安信实验室教你如何实现Windows自动安装!

    用户接入硬件后 Windows 自动下载安装或更新厂商的驱动软件 特点 1 产品的驱动程序及软件已放入微软官方驱动程序库 全世界用户都可以很快捷和方便地自动安装厂商自定义的软件 驱动通过微软官方认证 最佳安全性保障和信用背书 应用软件可以自
  • Windows内核面试题(持续更新,目前完成度30%约1.8万字)

    WINDOWS内核编程问题与答案 1 WDK和SDK的区别是什么 2 WDK全称叫做 3 如何创建WDK程序 4 WinDbg如何连接虚拟机 5 Windows内核符号表的作用 6 如何设置内核符号表与源文件 7 如何设置断点与源码调试 8
  • mutex_init() / mutex_lock() / mutex_unlock()

    请求 1 初始化互斥体 mutex init 2 获得互斥体 mutex lock 3 释放互斥体 mutex unlock 1 mutex init 注意mutex使用之前都需要先init void mutex init struct m
  • 深入解决Linux内存管理之page fault处理

    说明 Kernel版本 4 14 ARM64处理器 Contex A53 双核 使用工具 Source Insight 3 5 Visio 1 概述 内核实现只是在进程的地址空间建立好了vma区域 并没有实际的虚拟地址到物理地址的映射操作
  • nvidia-docker容器迁移导致GPU启动失败解决方案

    引言 起因是最近发现一个很有趣的问题 当我的docker容器迁移到另一台服务器去 因为GPU版本不一致导致项目启动是会报错为 CUDA error CUDA ERROR NO DEVICE no CUDA capable device is
  • SPI转can芯片CSM300详解以及Linux驱动移植调试笔记

    更多嵌入式Linux干货 请关注 一口Linux 一 CSM300概述 CSM300 A 系列是一款可以支持 SPI UART 接口的CAN模块 1 简介 CSM300 A 系列隔离 SPI UART 转 CAN 模块是集成微处理器 CAN
  • Windows Server 2019 会话远程桌面-快速部署(RemoteApp)

    目录 一 实验要求 二 搭建远程桌面服务RDS 三 需要软件安装 1 安装Firefox 浏览器 2 安装一款视频播放器 3 安装WPS office 套件 四 发布应用 1 发布Firefox 浏览器 2 发布一款视频播放器 3 发布WP
  • Linux源码编译开启cgroup blk限制io性能

    编译选项 内核5 9 General Setup gt Control Group support gt io controller Enable the block layer gt Block layer bio throttling
  • 内核虚拟化KVM/QEMU——guest os,qemu,kvm的运行流程

    内核虚拟化KVM QEMU guest os qemu kvm的运行流程 这里主要介绍基于x86平台的Guest Os Qemu Kvm工作流程 如图 通过KVM APIs可以将qemu的command传递到kvm 1 创建VM syste
  • CentOS7编译内核

    下面记录了我在CentOS7上编译新内核的过程 背景 实验室的一台服务器上装且仅装了CentOS7 内核版本为3 10 0 327 el7 x86 64 我要在当前系统上 编译 安装内核4 1 16 搭建编译环境 sudo yum inst
  • 设备虚拟化基础 - PCI

    目录 1 配置空间概念和作用 2 通过配置空间发现设备 3 Linux读取PCI配置空间接口 4 内核中具体读取配置空间实例 5 Virtion设备自定义空间 6 Linux读取Capabilities List代码解析 1 配置空间概念和

随机推荐

  • ad域下发策略_AD域部署软件自动下发

    今天介绍如何使用组策略自动将程序分发到客户端计算机或用户 您可以通过以下方法使用组策略分发计算机程序 创建一个共享网络文件夹 将您要分发的 Microsoft Windows 安装程序包 msi 文件 放入此文件夹 对该共享设置权限以允许访
  • (elementui-图片预览)el-dialog+el-image图片显示问题

    项目场景 有一个修改的页面 这个页面有个预览按钮 其实点击图片使用v viewer已经实现了预览的功能了 现在做的是另一套方案 el image中预览图片 问题描述 当el dialog el image是直接写在addOrupdate v
  • boost升压电路解析

    1 boost拓扑 基本原理 1 1 电路接好 C上已经有电压 1 2 Q导通 电感储能 1 3 Q关断 电感释放能量 再次向C充电 使其高于Vi Vo Vin 1 D 极性相同 升压 2 元器件 开关管Q 储能电感L 整流二极管D 防止环
  • 单反相机的照片删了如何恢复

    单反相机的照片删了如何恢复 单反相机照片 视频等数据一般都储存在内存卡里 这是可以恢复的 当然 前提是没有被新数据覆盖 如果需要恢复的话 通常也都需要借助数据恢复软件 失易得数据恢复 进行修复 大部分软件在操作时都 第一步 打开 失易得数据
  • 如何利用J-Link烧写进行程序烧写

    1 准备工作 1 1硬件准备 准备一个烧写器 如下图所示 1 2软件准备 需要JLink软件安装包和驱动 如下图所示 JLink 652e rar为软件安装包 ST LINK V2 zip为驱动文件 首先安装J Link软件 解压第一个压缩
  • STM32小知识

    为什么电压常见3v3和5v 因为早期单片机用的都是TTL电平 TTL电平信号规定 5V等价于逻辑 1 0V等价于逻辑 0 采用二进制来表示数据时 这样的数据通信及电平规定方式 被称做TTL 晶体管 晶体管逻辑电平 信号系统 这是计算机处理器
  • css修饰边框为虚线,css如何设置虚线边框css虚线样式?css设置虚线边框的方法示例...

    首页 gt web前端 gt css教程 gt 正文 css如何设置虚线边框 css设置虚线边框的方法示例 原创2018 10 在网页布局中 有时候为了整体网页的美观可能需要设置虚线边框 那么虚线边框怎么设置呢 本篇文章就来给大家介绍一下如
  • arduino下载库出错_纯干货!关于Arduino 库在多种操作系统安装使用最详细、最全面的指南及常见问题解决办法!...

    什么是Arduino 库 Arduino库是一种共享开源代码 如设备驱动程序或常用实用程序函数 的最方便方式 Arduino 库是这个开源平台最大的特色之一 正是有了海量的Arduino开源库 让你无需花时间去了解和学习处理器底层的驱动程序
  • vue动态样式通过计算属性绑定的方法

    div class fayuan item typeName div
  • 超点图论文网络环境配置

    超点图环境配置 前言 一 检查环境情况并安装 1 检查是否安装有NVIDIA驱动 2 检查是否安装cuda 3 检查是否安装pytorch 4 安装相应库文件 二 常见问题 1 输入nvcc报错 总结 前言 提示 本文参照文章进行配置 环境
  • WebRTC中AECM算法简介

    1 算法介绍以及整体框架 1 1算法整体框架 AECM 属于 WebRTC 语音处理引擎 Voice Engine 的子模块 是为移动设备专门设计的回声消除处理模块 其内部有根据芯片类型进行汇编指令级的特殊优化 AECM 的主体工程文件可以
  • 调用微信内置 wx.config 配置问题

    var link location href ajax url WxJSSDK WxJS SDK aspx GetInfoMation 后台给你提供的接口 type Post data url link async false conten
  • [Spring Boot]04 使用IDEA快速搭建多模块项目

    目录 一 项目介绍 二 创建父工程 三 搭建多模块 1 搭建shopping api 2 搭建shopping bi 3 搭建shopping common 4 删除不需要的文件 5 多模块配置 1 父工程pom xml配置 2 子模块po
  • 打印回型数组-回型矩阵-环形数组

    刚才看到打印回形矩阵 或者回型数组 环形数组 网上一些方法感觉写的挺麻烦 还是自己写一遍吧 不妥之处还请各位看官不吝赐教 题目 输入一个整数N 打印出从1 N N的N N矩阵 比如N 3 构成矩阵 1 2 3 8 9 4 7 6 5 N 5
  • 分享:Go语言使用字符串的几个技巧

    本文小编将给出一些Go语言在处理字符串方面的技巧 对大家学习Go语言具有一定的参考借鉴价值 下面一起看看吧 一 字符串底层就是一个字节数组 这真的非常重要 而且影响着下面的其他几个技巧 当你创建一个字符串时 其本质就是一个字节的数组 这意味
  • Nginx代理连接Redis失败

    遇到了一个客户端连接Redis总是失败的问题 由于是通过nginx代理连接的 又尝试不通过nginx代理连接直接连接redis地址 不过连接很不稳定 不时就断了 因为这部分配置跑了一年多了 也没想到是nginx的问题 各种排查网络情况 弄了
  • xampp+Testlink安装问题

    安装xampp 一1 首先下载一个 xampp安装文件 记得分好32位还是64位 下载完后 点击安装 在出现选择安装路径的一个窗口 安装在C xampp 然后 直接Next一直到finsh 启动后效果为下图 如果启动成功了 那两个start
  • 前端框架Bootstrap

    bootstrap框架 内部提供了很多漂亮的标签样式和功能 我们只需要CV使用即可 bootstrap版本 推荐使用v3版本 Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HTML CSS 和 JavaScript
  • 前端根据token控制路由跳转(配置路由拦截全局前置守卫)

    在配置路由中需要拦截的加上 meta requiresAuth true import Vue from vue import VueRouter from vue router Vue use VueRouter const routes
  • qemu: 设备后端模拟

    目录 1 网卡模拟 2 网卡参数解析 3 qemu前端虚拟网卡设备创建 4 报文发送流程 5 报文发送流程 1 网卡模拟 参数 netdev type tap id eth0 ifname tap30 script no downscrip