QEMU中的IOCTL

2024-04-30 14:08
文章标签 qemu ioctl

本文主要是介绍QEMU中的IOCTL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

5. QEMU中的IOCTL

在QEMU-KVM中,用户空间的QEMU是通过IOCTL与内核空间的KVM模块进行通讯的。

1. 创建KVM

在/vl.c中通过kvm_init()将会创建各种KVM的结构体变量,并且通过IOCTL与已经初始化好的KVM模块进行通讯,创建虚拟机。然后创建VCPU,等等。

2. KVM_RUN

这个IOCTL是使用最频繁的,整个KVM运行就不停在执行这个IOCTL,当KVM需要QEMU处理一些指令和IO等等的时候就会退出通过这个IOCTL退回到QEMU进行处理,不然就会一直在KVM中执行。

它的初始化过程:

vl.c中调用machine->init初始化硬件设备接着调用pc_init_pci,然后再调用pc_init1。

接着通过下面的调用初始化KVM的主循环,以及CPU循环。在CPU循环的过程中不断的执行KVM_RUN与KVM进行交互。

pc_init1->pc_cpus_init->pc_new_cpu->cpu_x86_init->qemu_init_vcpu->kvm_init_vcpu->ap_main_loop->kvm_main_loop_cpu->kvm_cpu_exec->kvm_run

3.KVM_IRQ_LINE

这个IOCTL和KVM_RUN是不同步的,它也是个频率非常高的调用,它就是一般中断设备的中断注入入口。当设备有中断就通过这个IOCTL最终调用KVM里面的kvm_set_irq将中断注入到虚拟的中断控制器。在kvm中会进一步判断属于什么中断类型,然后在合适的时机写入vmcs。当然在KVM_RUN中会不断的同步虚拟中断控制器,来获取需要注入的中断,这些中断包括QEMU和KVM本身的,并在重新进入客户机之前注入中断。

1.代码结构

如我们所知,QEMU是一个模拟器,它能够动态模拟特定架构的CPU指令,如X86,PPC,ARM等等。QEMU模拟的架构叫目标架构,运行QEMU的系统架构叫主机架构,QEMU中有一个模块叫做微型代码生成器(TCG),它用来将目标代码翻译成主机代码。如下图所示。

    

 

我们也可以将运行在虚拟cpu上的代码叫做客户机代码,QEMU的主要功能就是不断提取客户机代码并且转化成主机指定架构的代码。整个翻译任务分为两个部分:第一个部分是将做目标代码(TB)转化成TCG中间代码,然后再将中间代码转化成主机代码。

QEMU的代码结构非常清晰但是内容非常复杂,这里先简单分析一下总体的结构


这篇关于QEMU中的IOCTL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949077

相关文章

Linux 云计算底层技术之一文读懂 Qemu 架构

Qemu 架构概览 Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。 正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成

QEMU用户模式测试AARCH64程序

QEMU的两种模式 QEMU(快速模拟器)是一个开源的机器模拟器和虚拟化器,它能够模拟多种处理器架构,并且可以在不同平台上运行。QEMU 支持两种模式:用户模式和系统模式。 用户模式(User Mode): 用户模式下的 QEMU 仅模拟用户空间的二进制执行环境,不模拟底层硬件。这种模式下,QEMU 可以运行不同架构编译的二进制程序,而不需要这些程序与宿主机的架构相匹配。用户模式通常用于测试和

ubuntu22.04 qemu 安装windows on arm虚拟机

ubuntu22.04 qemu 安装windows on arm虚拟机 iso: https://uupdump.net/ https://massgrave.dev/windows_arm_links vivo driver: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/

ioctl的注册方式

1、通过内核文件进行注册 注册形式: long pon_mci_ioctl(struct file *filp, uint cmd, ulong arg) {int ret = -EINVAL ;while(TRUE == should_iotcl_wait() ){msleep(100) ;}#ifdef TCSUPPORT_WAN_GPONif(_IOC_TYPE(cmd) == GPO

Qemu创建虚拟机

下载安装qemu: https://qemu.weilnetz.de/w64/ 下载windows iso光盘映像: https://msdn.itellyou.cn/#:~:text=MSDN,%20%E6%88%91%E5%91%8A Qemu安装目录运行cmd,并输入如下命令: qemu-img create -f qcow2 winxp.img 10Gqemu-system-x8

新路程------imx6 lvds ioctl

最近有个需求,做一些接口给上层应用调用 于是看了一下驱动,linux有一套标准的framebuffer机制让我们做接口,就是fb_ioctl 首先看对应的framebuffer驱动,在之前的ldb.c中,确实配置了对应的fb_info结构体,但是要修改这个结构体的参数并不需要在ldb.c中做,在mxc_ipuv3_fb.c里 static struct fb_ops mxcfb_ops

tiny_qemu模拟qemu虚拟化原理

一、模仿一个x86平台虚机 cpu虚拟化原理来源于Linux虚拟化KVM-Qemu分析(四)之CPU虚拟化(2) 笔者就实现了下相关操作。看汇编是在x86平台下操作的,其中两个文件分别是 1.tiny_kernel.S start:/* Hello */mov $0x48, %aloutb %al, $0xf1mov $0x65, %aloutb %a

QEMU - user network

Documentation/Networking - QEMUQEMU/KVM中的网络虚拟化--Part2 User Networking | Xiaoye Zheng's blog (zxxyy.github.io)QEMU Network — ARM SoC Device Assignment Notes documentation (cwshu.github.io)slirp / libsl

QEMU+ARM+Linux(3)

zImage可以运行了,再来试试用uboot引导uImage。 首先是编译uImage,命令在QEMU+ARM+Linux(1)中已经给出了: export ARCH=armexport CROSS_COMPILE=arm-linux-gnueabi-make vexpress_defconfig#make zImage -j8make modules -j8make LOADADDR=0x

QEMU+ARM+Linux(2)

参考: 没开发板做Linux嵌入式开发?虚拟机搞定一切!(主要参考) qemu+uboot+kernel+nfs文件系统(主要参考) qemu-system-arm仿真vexpress-a9踩坑记 Qemu搭建ARM vexpress开发环境(一) 之前已经得到了Linux kernel的zImage。 参考第一篇文章: zImage和uImage两个都是编译出来的linux二进制文件进行压