Settings

Theme

QEMU 10.1.0

wiki.qemu.org

302 points by dmitrijbelikov 4 months ago · 60 comments

Reader

dijit 4 months ago

QEMU is truly excellent software, from the perspective of a person who very rarely needs to emulate another architecture. It "just works" and has wonderful integrations with basically everything I could want.. sometimes it feels like magic: even if the commandline UX is a bit weird in places.

I've always wondered though how it works with KVM: I know KVM is a virtualisation accelerator that enables passing through native code to the CPU somehow; but it feels like QEMU/KVM basically runs the internet now. Almost the entire modern cloud is built on QEMU and KVM as a hypervisor (right?) but I feel like I'm missing a lot about how it's working.

I also wonder if this steals huge amounts of resources away from emulation, or does it end up helping out. Because to say the modern internet is largely running on QEMU is likely a massive understatement.

  • monocasa 4 months ago

    KVM is basically three components.

    * An abstraction over second level page tables to map some of a host user process as what the guest thinks of as physical memory.

    * An abstraction to jump into the context that uses those page tables, and traps back out in the case of anything that the hardware would normally handle, but the hypervisor wants to handle manually instead.

    * A collection of mechanisms to handle some of those traps in kernel space to avoid having to context switch back out to the host user process if the kind of trap is common enough, both in the sense of the trap itself happens often enough to show up on perf graphs, as well as the abstraction being exercised is relatively standard (think interrupt controllers and timers).

    Let me know if you have any other questions.

    • eddd-ddde 4 months ago

      Where could someone get started in terms of reading material to learn more about this in depth?

      • yjftsjthsd-h 4 months ago

        From a different direction, I'd suggest https://www.devever.net/~hl/kvm

      • dysoco 4 months ago

        I would assume sooner or later you're going to end up in the Intel Developer manuals or the equivalent for whatever architecture you are interested in. The Intel ones are very complete at least.

        • znpy 4 months ago

          > I would assume sooner or later you're going to end up in the Intel Developer manuals or the equivalent for whatever architecture you are interested in. The Intel ones are very complete at least.

          I can vouch for this. I'm no virtualization expert but I did stumble upon some intel developers manuals (truthfully, i fell into the rabbit hole) and just skimming it made everything make much more sense.

          For example: https://www.intel.com/content/dam/www/public/us/en/documents... - "CHAPTER 23 INTRODUCTION TO VIRTUAL MACHINE EXTENSIONS"

          The link above explains how the VMX extension work on intel processors. Any software doing hardware-assisted virtualization (so no binary translation, no full-system-emulation) will likely be using those instructions.

        • jlokier 4 months ago

          The AMD Processor Programming Reference manuals are also good for this, if you like complete and detailed. They complement the Intel manuals. Much the material is duplicate because the processors are so similar, but written in a different way.

      • billywhizz 4 months ago

        if you want to look at existing implementations on top of kvm then these might be useful - rust-vmm is a core library for AWS' firecracker vmm.

        https://github.com/rust-vmm/kvm https://github.com/kvmtool/kvmtool https://github.com/sysprog21/kvm-host

    • accelbred 4 months ago

      How does nested KVM work? Are all the page tables handled by the top level? Do the traps have to propagate up?

      • bonzini 4 months ago

        Yes, the top level uses write protection of guest memory to combine the two levels of translation into one.

    • privatelypublic 4 months ago

      I thought part of vt-d/vt-x made the "virtual tables" actual tables.

      Eg- the memory the VM can access is controlled by the MMU of the CPU (below ring0/kernel). Resulting in the only VM escapes being the Shim(s) for talking with the host (network, memory balloon, graphics).

      • bonzini 4 months ago

        Yes, there are virtualization-specific page tables that convert guest physical to host physical addresses. KVM still haw to take host userspace's virtual addresses, convert them to host physical addresses, and make sure that the virtualization-specific page tables stay in sync with the kernel's usual page tables (which convery host virtual addresses to host physical)

  • jamesy0ung 4 months ago
    • penguin_booze 4 months ago

      Excellent. I haven't gone through them yet, but if you've any similar pointers for QEMU, please share.

      My rough understanding is that it's the user-space emulation part of a virtualization solution. I.e., when the kernel traps the virtualized process, saying 'nope, you can't do that here', the control falls back to user space handler in QEMU saying, 'hey, the kernel said I can't do that there; can you sort this out?'. And this back-and-forth games keeps happening during the lifetime of the virtualized process.

    • dijit 4 months ago

      Awesome, thanks for the entrypoint!

  • teekert 4 months ago

    If you use it rarely, I can high recommend the excellent QuickEMU [0]

    Any VM is just a `quickget ubuntu 24.04` and `quickemu --vm ubuntu-24.04.conf` away. The conf file is just a yaml that is very readable and can give you more cores/ram/disk easily. Just run `quickget` to get a list of OS's to download.

    [0] https://github.com/quickemu-project/quickemu

    • mrheosuper 4 months ago

      Doesn't the 'q' in 'qemu' stand for "Quick" ?

      • teekert 4 months ago

        Looks like it does :) Maybe take it up with Martin Wimpress, who probably meant it as a way to jar us all just a tad (knowing him from podcasts he probably has a witty and funny response to such inquiries).

  • stinkbeetle 4 months ago

    > I've always wondered though how it works with KVM

    Other people have given some more comprehensive explanations, but I'll try to put it as simply as possible.

    Plain QEMU has a CPU emulation layer called TCG. The machine basically consists of memory (RAM and MMIO devices) and CPUs (CPU registers and state). When QEMU has set up the machine and is ready to run, it calls TCG to say "given this memory and this initial CPU register state, start running instructions". When you use QEMU with KVM, the TCG emulation layer is swapped out with KVM and it asks KVM to start running instructions. That's it. KVM exposes APIs that caller can specify guest memory and initial CPU register state, and a call to run that CPU with that memory.

    Going a bit further, the hardware virtualization functions that KVM uses have the ability to map that memory with a second level of translation which lets KVM present it to the guest at the locations it expects, and to prevent the guest from accessing any memory that it should not. The hardware also has the ability to run the CPU in a mode where it has the normal set of registers (which is what QEMU wants), but it maintains some additional hypervisor control registers not available to the guest, and those can ensure the guest can't take complete control of the CPU (for example, the guest OS can "disable interrupts" with the usual MSR or similar bit and that does prevent the guest from getting interrupts, but that it does not disable hypervisor directed interrupts, so the hypervisor can always take back control of the CPU with a hypervisor-IPI or hypervisor timer interrupt).

    Further still: when running in plain QEMU mode, devices are emulated by registering MMIO ranges in the memory address space and emulated loads and stores have code to detect these regions and instead of performing a simple load or store, they call into device model code which handles it accordingly. When you plug KVM in, you can still use these emulated devices. These are modeled by using that second level page table to put "not-valid" mappings in those MMIO ranges. These cause the CPU to trigger a page fault when it tries to access them, and KVM sees this, looks up the table of memory registered by QEMU, and sees that it is an address which QEMU wants to handle, so it returns from the KVM_RUN system call with result code that indicates there was an MMIO read/write that needs to be handled. QEMU then directs this into its emulated device model. Then when QEMU has performed that device emulation, it calls back into KVM to continue running the CPU.

    It's all pretty clever. The really astounding thing is that most of the basic concepts for all this stuff were developed/discovered/invented like 50+ years ago.

  • pm215 4 months ago

    Resources-wise there's not really any "stealing" going on. The people/companies who care about KVM and the virtualization use cases work on that, and the people/companies who care about emulation work on those parts. If QEMU didn't support virtualization then it's not like the people currently working on QEMU virtualization would shift over to emulation support: they'd be working on some other project instead to achieve their VM goals.

  • dizhn 4 months ago

    qemu/kvm in enabling the cloud is huge but that's not the only place it really makes a tremendous difference. One example where it's essential is new OS development. They all basically first target the qemu machine with its virtual hardware. It makes development much faster compared to running on real hardawre while easily enabling debug output without needing cables and the like.

    • monocasa 4 months ago

      Eh, we just used stuff like bochs and vmware prior.

      • dizhn 4 months ago

        I didn't mean qemu is the only option.

        • monocasa 4 months ago

          My point is that the appearance qemu/kvm didn't really practically change the space much.

          • dizhn 4 months ago

            Oh I understand what you're saying. You're probably right. Collectively virtualization allows a lot but qemu might not be as exclusive as I said. (I think there are only a few years between bocsh/vmware and qemu/xen.)

            EDIT: I didn't mean to sound like ChatGPT. It happened naturally :)

  • lathiat 4 months ago

    Not everything uses qemu. Some do. More use KVM. Not everything does.

    Example: https://firecracker-microvm.github.io/

    • xyse53 4 months ago

      I've found QEMUs microvm to be faster at boot while having nicer tooling and a cleaner upgrade path if needing more features. Aside from hype I'm actually not sure why anyone would still use firecracker.

      • monocasa 4 months ago

        Mainly because of the much larger attack surface of QEMU.

        • xyse53 4 months ago

          I can't quantify how much of that surface is also reduced with the microvm machine vs other parts of QEMU vs Firecracker... But fair enough point.

  • hnlmorg 4 months ago

    Xen is still used massively too.

    • bonzini 4 months ago

      AWS runs Xen guests through a KVM-based compatibility layer. You can try it with QEMU too.

drzaiusx11 4 months ago

> Experimental support for compiling to WASM using Emscripten.

Neat. This will unlock various online "playgrounds" for a number of CPU architectures, among other interesting use cases.

Likely this was possible beforehand, but it's nice to see it added as a feature to the project directly.

  • jononor 4 months ago

    Could be cool for interactive simulator of microcontroller/embedded in browser.

_mlbt 4 months ago

If you’re on macOS or iOS, UTM is an excellent Qemu front end.

https://getutm.app/

https://mac.getutm.app/

jbotz 4 months ago

https://en.wikipedia.org/wiki/Fabrice_Bellard

osrec 4 months ago

A great piece of software that makes my and my dev team's life infinitely better and easier. A big thank you to the QEMU developers :)

tracker1 4 months ago

I'm curious if QEMU will ever support features like x86(_64) hardware paths that with Arm and RISC-V... Since most of the patents are now expired, it makes a lot of sense. Apple seems to be further along here than other competitors, but it seems to be limited to Rosetta, not broadly supported.

  • bonzini 4 months ago

    If the kernel makes it available to userspace, then it could be done. I am not aware of any specific emulation-friendly extensions to RISC-V though.

    • tracker1 4 months ago

      Me either, but I'm assuming they'll start to become more common. Possibly the inverse as well, ARM cores on x86 even.

xhrpost 4 months ago

Didn't realize there was a MIPS build of Windows NT. Which led me to wikipedia to find there were a lot of other architectures supported in the past.

  • cbm-vic-20 4 months ago

    In my last job, I was on the team that handled the Windows NT bulid on DEC Alpha. Native Alpha apps were much faster than the equivalent Intel NT machines. Apropos to this topic, DEC had a sybsystem called FX!32 that was sort of like what Rosetta does for Apple Silicon, allowing Intel apps to be run at useable speeds on Alpha.

    https://en.wikipedia.org/wiki/FX!32

ducktective 4 months ago

Awesome tech!

It's not possible to run an android VM on QEMU right? As in, is it officially supported? (I know about Waydroid)

  • epilys 4 months ago

    Yes, it's possible and supported. QEMU can emulate an aarch64 system, and Google provides aarch64 Android builds for virtual machines specifically, called "Cuttlefish". Search for keywords "Android Cuttlefish QEMU" for instructions.

  • homebrewer 4 months ago

    The official Android "emulator" supplied by Google is qemu. If you're not satisfied with it for some reason, IIRC I used these images some years ago on top of vanilla qemu:

    https://www.fosshub.com/Android-x86.html

    They don't seem to be well supported anymore, and there aren't many prebuilt alternatives. One can always compile AOSP from source, though Google does not make this easy.

    • acuozzo 4 months ago

      > The official Android "emulator" supplied by Google is qemu

      Nitpick: It's a fork of QEMU. There are quite a few Google-exclusive changes bundled-in.

simonebrunozzi 4 months ago

Curious: how do people use Qemu the most these days? Dev environment? Running specific apps on a different OS? I don't know... gaming?

mrlonglong 4 months ago

Fabrice Ballard is a genius.

Havoc 4 months ago

Their website appears to be broken?

>(Cannot access the database)

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection