我已经创建了一个C内核,我正在QEMU模拟器中加载内核.但是当我加载内核时,它似乎崩溃QEMU并且它抱怨它无法访问kvm文件夹.这是否意味着缺少kvm,或者我不是管理员; 因为我以root管理员身份登录 以下是源自终端的错误信息:
danny@ubuntu:~/Desktop$ sudo qemu -kernel os.bin
open /dev/kvm: No such file or directory
Could not initialize KVM, will disable KVM support
pci_add_option_rom: failed to find romfile "pxe-rtl8139.bin"
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a0000
EAX=00004500 EBX=00000000 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00009fe0
EIP=0000fdfb EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =9000 00090000 ffffffff 00cf9300
CS =9020 00090200 0000ffff 00009b0f
SS =9000 00090000 0000ffff 00009300
DS =9000 00090000 0000ffff 00009300
FS =9000 00090000 …Run Code Online (Sandbox Code Playgroud) 如何使用libvirt创建瞬态域?(使用QEMU/KVM作为后端)
该文档讨论了此链接上的瞬态域和持久域之间的区别:http://wiki.libvirt.org/page/VM_lifecycle#Transient_guest_domains_vs_Persistent_guest_domains
尽管如此,我还没有找到任何关于如何创建一个的具体例子.
我找到的唯一指针是在这封电子邮件中:https://www.redhat.com/archives/libvirt-users/2011-August/msg00057.html,其中维护者建议在XML的描述字段中添加<transient/>标记<disk>.
当我尝试时,我得到了这个令人失望的答案:"libvirtError: unsupported configuration: transient disks not supported yet".
这个功能真的"还不支持",还是我错过了什么?该文档让我觉得应该支持这一点.
任何与C或Python绑定,virsh或virt-manager相关的答案都将受到高度赞赏!
我在QEMU下运行我的保护模式内核,并且在尝试执行汇编程序HLT指令时导致一般保护错误.CPL为0,EFLAGS中IOPL为0,启用中断.
这可能是QEMU问题还是我错过了什么?
在模拟SMP(对称多处理器)时会发生这种情况.
例如,使用BIOS打印a到屏幕的引导扇区main.asm:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
然后:
nasm -o main.img main.asm
qemu-system-i386 -hda main.img -S -s &
gdb -ex 'target remote localhost:1234' \
-ex 'break *0x7c00' \
-ex 'continue' \
-ex 'x/3i $pc'
Run Code Online (Sandbox Code Playgroud)
我明白了:
0x7c00: cli
0x7c01: mov $0x10cd0e61,%eax
0x7c06: hlt
Run Code Online (Sandbox Code Playgroud)
所以看起来它mov ax, 0x0E61被解释为32位mov %eax并且将下一条指令int 0x10作为数据.
我怎么能告诉GDB这是16位代码?
也可以看看:
objdump" https://www.sourceware.org/ml/gdb/2007-03/msg00308.html,如下所示:如何反汇编原始x86代码?也许这是在实施的同时实施的?在./configure它显示此错误后:
Run Code Online (Sandbox Code Playgroud)ERROR: pixman >= 0.21.8 not present. Your options: (1) Preferred: Install the pixman devel package (any recent distro should have packages as Xorg needs pixman too). (2) Fetch the pixman submodule, using: git submodule update --init pixman
所以我和qemu kvm合作了一段时间,现在我需要通过PCI设备.我做了所有必要的程序来完成这项工作:启用iommu,modprobed vfio模块,绑定设备到vfio并检查vfio组确实是创建的等等...但是当我用任何pci设备启动qemu时,我收到错误消息:
vfio:无法读取设备配置空间
我深入研究qemu的代码,看看问题可能是什么,并发现问题出现在设备的pread上.即使偏移量为0,也会发生这种情况,并且对文件描述符执行正常读取时没有问题,因为我更改了代码以进行测试.检查errno因为pread失败的原因给我一个' 非法搜索 '错误消息.
我写了一些代码,看看这是否发生在qemu上下文之外(认为它可能是qemu代码中干扰设备的东西),并且有同样的问题.我也尝试用pread读取一个普通的文件,并且完美地工作......这是我编写的代码来测试它,我把它分解了一下,以便能够指出更相关的部分:
#define BUF_SIZE 4096
int main(){
char buf[BUF_SIZE], buf1[BUF_SIZE], buf2[BUF_SIZE];
int ret,group_fd, fd, fd2;
size_t nbytes = 4096;
ssize_t bytes_read;
int iommu1, iommu2;
int container, group, device, i;
struct vfio_group_status group_status = { .argsz = sizeof(group_status) };
struct vfio_iommu_type1_info iommu_info = { .argsz = sizeof(iommu_info) };
struct vfio_iommu_type1_dma_map dma_map = { .argsz = sizeof(dma_map) };
struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
container = open("/dev/vfio/vfio",O_RDWR);
if(ioctl(container,VFIO_GET_API_VERSION)!=VFIO_API_VERSION){
printf("Unknown api version: %m\n");
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用以下选项启动qemu的脚本:
qemu-system-x86_64 [...]
-net nic,model=rtl8139
-net user,hostfwd=tcp::5555-:1522
-net dump,file=/tmp/vm0.pcap
-redir tcp:9999::9
-redir tcp:17010::17010
-redir tcp:17013::17013
我想更新脚本以使用现代qemu选项。
我尝试使用以下参数,如手册页中所述
qemu-system-x86_64 [...]
-net nic,model=rtl8139
-net dump,file=/tmp/vm0.pcap
-net user,id=tcp1522,hostfwd=tcp::5555-:1522
-netdev user,id=tcp9,hostfwd=tcp::9999-:9
-netdev user,id=tcp17010,hostfwd=tcp::17010-:17010
-netdev user,id=tcp17013,hostfwd=tcp::17013-:17013
但是来宾无法再访问网络,主机也无法在转发的端口上访问该网络。
不推荐使用的-redir选项的确切含义是什么?
我尝试以下方法通过 macOS 主机上运行的 Ubuntu 来宾访问 USB 存储设备:
sudo qemu-system-x86_64 -m 8G -boot d -smp 4 -net nic -net user \
-hda Ubuntu/ubuntu.img -machine type=q35,accel=hvf \
-device intel-hda -device hda-duplex \
-device nec-usb-xhci -device usb-host,vendorid=0x0781,productid=0x5580
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法从访客访问 USB 设备。访客系统日志说:
... kernel: [...] usb 5-1: USB new high-speed USB device number 3 using xhci_hcd
... kernel: [...] usb 5-1: New USB device found, idVendor=0781, idProduct=5580, bcdDevice= 0.10
... kernel: [...] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
... kernel: [...] usb …Run Code Online (Sandbox Code Playgroud) 从 docker 容器(在我的例子中运行基于 Debian Busty 的映像)中,如何检测它是否在 QEMU 模拟下运行(如在 ARM Mac 上运行 AMD64 映像)?
从非 docker 的角度来看,我看到了cpuinfo可能会出现这种情况的建议,但当从容器内部运行时,它不会产生任何与 QEMU 直接相关的内容:
$ docker run -it --entrypoint /bin/bash debian-buster-based-amd64-image
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
root@c93f6a8ec754:/app# cat /proc/cpuinfo
processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit …Run Code Online (Sandbox Code Playgroud) 我在 Linux x86_64 上的 Android Studio 中创建了一个 ARM64 的虚拟设备。
当我从 GUI 启动它时,它显示该进程已终止。
当我从命令行启动它时:
./emulator -avd VM2
它显示:
PANIC: Avd's Cpu Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host.
详细信息:
主机CPU:Intel Core i5-4210U;启用英特尔VT;64 位;
主机操作系统:Debian GNU/Linux 11;64 位;
Android Studio:Linux 版 Bumblebee;Linux 4.0;
安卓系统:API32 arm64-v8a;12.0arm64-v8a;
系统支持KVM;
我尝试过:
完全重新安装Android Studio;
不同版本的Android Studio;
不同版本的Android ARM64;
安装 qemu-system-arm;gcc-arm...;
但它们都不起作用。我该如何解决?