|  | .. _ARM-System-emulator: | 
|  |  | 
|  | Arm System emulator | 
|  | ------------------- | 
|  |  | 
|  | QEMU can emulate both 32-bit and 64-bit Arm CPUs. Use the | 
|  | ``qemu-system-aarch64`` executable to simulate a 64-bit Arm machine. | 
|  | You can use either ``qemu-system-arm`` or ``qemu-system-aarch64`` | 
|  | to simulate a 32-bit Arm machine: in general, command lines that | 
|  | work for ``qemu-system-arm`` will behave the same when used with | 
|  | ``qemu-system-aarch64``. | 
|  |  | 
|  | QEMU has generally good support for Arm guests. It has support for | 
|  | nearly fifty different machines. The reason we support so many is that | 
|  | Arm hardware is much more widely varying than x86 hardware. Arm CPUs | 
|  | are generally built into "system-on-chip" (SoC) designs created by | 
|  | many different companies with different devices, and these SoCs are | 
|  | then built into machines which can vary still further even if they use | 
|  | the same SoC. Even with fifty boards QEMU does not cover more than a | 
|  | small fraction of the Arm hardware ecosystem. | 
|  |  | 
|  | The situation for 64-bit Arm is fairly similar, except that we don't | 
|  | implement so many different machines. | 
|  |  | 
|  | As well as the more common "A-profile" CPUs (which have MMUs and will | 
|  | run Linux) QEMU also supports "M-profile" CPUs such as the Cortex-M0, | 
|  | Cortex-M4 and Cortex-M33 (which are microcontrollers used in very | 
|  | embedded boards). For most boards the CPU type is fixed (matching what | 
|  | the hardware has), so typically you don't need to specify the CPU type | 
|  | by hand, except for special cases like the ``virt`` board. | 
|  |  | 
|  | Choosing a board model | 
|  | ====================== | 
|  |  | 
|  | For QEMU's Arm system emulation, you must specify which board | 
|  | model you want to use with the ``-M`` or ``--machine`` option; | 
|  | there is no default. | 
|  |  | 
|  | Because Arm systems differ so much and in fundamental ways, typically | 
|  | operating system or firmware images intended to run on one machine | 
|  | will not run at all on any other. This is often surprising for new | 
|  | users who are used to the x86 world where every system looks like a | 
|  | standard PC. (Once the kernel has booted, most userspace software | 
|  | cares much less about the detail of the hardware.) | 
|  |  | 
|  | If you already have a system image or a kernel that works on hardware | 
|  | and you want to boot with QEMU, check whether QEMU lists that machine | 
|  | in its ``-machine help`` output. If it is listed, then you can probably | 
|  | use that board model. If it is not listed, then unfortunately your image | 
|  | will almost certainly not boot on QEMU. (You might be able to | 
|  | extract the filesystem and use that with a different kernel which | 
|  | boots on a system that QEMU does emulate.) | 
|  |  | 
|  | If you don't care about reproducing the idiosyncrasies of a particular | 
|  | bit of hardware, such as small amount of RAM, no PCI or other hard | 
|  | disk, etc., and just want to run Linux, the best option is to use the | 
|  | ``virt`` board. This is a platform which doesn't correspond to any | 
|  | real hardware and is designed for use in virtual machines. You'll | 
|  | need to compile Linux with a suitable configuration for running on | 
|  | the ``virt`` board. ``virt`` supports PCI, virtio, recent CPUs and | 
|  | large amounts of RAM. It also supports 64-bit CPUs. | 
|  |  | 
|  | Board-specific documentation | 
|  | ============================ | 
|  |  | 
|  | Unfortunately many of the Arm boards QEMU supports are currently | 
|  | undocumented; you can get a complete list by running | 
|  | ``qemu-system-aarch64 --machine help``. | 
|  |  | 
|  | .. | 
|  | This table of contents should be kept sorted alphabetically | 
|  | by the title text of each file, which isn't the same ordering | 
|  | as an alphabetical sort by filename. | 
|  |  | 
|  | .. toctree:: | 
|  | :maxdepth: 1 | 
|  |  | 
|  | arm/integratorcp | 
|  | arm/mps2 | 
|  | arm/musca | 
|  | arm/realview | 
|  | arm/sbsa | 
|  | arm/versatile | 
|  | arm/vexpress | 
|  | arm/aspeed | 
|  | arm/bananapi_m2u.rst | 
|  | arm/sabrelite | 
|  | arm/digic | 
|  | arm/cubieboard | 
|  | arm/emcraft-sf2 | 
|  | arm/highbank | 
|  | arm/musicpal | 
|  | arm/gumstix | 
|  | arm/mainstone | 
|  | arm/kzm | 
|  | arm/nrf | 
|  | arm/nseries | 
|  | arm/nuvoton | 
|  | arm/imx25-pdk | 
|  | arm/orangepi | 
|  | arm/palm | 
|  | arm/raspi | 
|  | arm/xscale | 
|  | arm/collie | 
|  | arm/sx1 | 
|  | arm/stellaris | 
|  | arm/stm32 | 
|  | arm/virt | 
|  | arm/xlnx-versal-virt | 
|  | arm/xenpvh | 
|  |  | 
|  | Emulated CPU architecture support | 
|  | ================================= | 
|  |  | 
|  | .. toctree:: | 
|  | arm/emulation | 
|  |  | 
|  | Arm CPU features | 
|  | ================ | 
|  |  | 
|  | .. toctree:: | 
|  | arm/cpu-features |