.. _enable_ivshmem: Enable Inter-VM Shared Memory Communication (IVSHMEM) ##################################################### About Inter-VM Shared Memory Communication (IVSHMEM) **************************************************** Inter-VM shared memory communication allows VMs to communicate with each other via a shared memory mechanism. As an example, users in the industrial segment can use a shared memory region to exchange commands and responses between a Windows VM that is taking inputs from operators and a real-time VM that is running real-time tasks. The ACRN Device Model or hypervisor emulates a virtual PCI device (called an IVSHMEM device) to expose this shared memory's base address and size. * Device Model: The IVSHMEM device is emulated in the ACRN Device Model, and the shared memory regions are reserved in the Service VM's memory space. This solution only supports communication between post-launched User VMs. * Hypervisor: The IVSHMEM device is emulated in the hypervisor, and the shared memory regions are reserved in the hypervisor's memory space. This solution works for both pre-launched and post-launched User VMs. While both solutions can be used in the same ACRN configuration, VMs using different solutions cannot communicate with each other. Dependencies and Constraints **************************** Consider the following dependencies and constraints: * Inter-VM shared memory communication is a hardware-neutral feature. * Guest OSes are required to have either of the following: - An IVSHMEM driver, such as `virtio-WIN `__ for Windows and `ivshmem APIs `__ in Zephyr - A mechanism granting user-space applications access to a PCI device, such as the `Userspace I/O (UIO) driver `__ in Linux Configuration Overview ********************** The :ref:`acrn_configurator_tool` lets you configure inter-VM shared memory communication among VMs. The following documentation is a general overview of the configuration process. To configure inter-VM shared memory communication among VMs, go to the **Hypervisor Global Settings > Basic Parameters > InterVM shared memory**. Click **+** to add the first shared memory region. .. image:: images/configurator-ivshmem01.png :align: center :class: drop-shadow For the shared memory region: #. Enter a name for the shared memory region. #. Select the source of the emulation, either Hypervisor or Device Model. #. Select the size of the shared memory region. #. **Enter shared memory region ID, which can be in hexadecimal or decimal format**. .. note:: Default value is 0 and IDs in 0x001 ~ 0xFFF are reserved, 0x1000 ~ 0xFFFF are available. #. Select at least two VMs that can use the shared memory region. #. Enter a virtual Board:Device.Function (BDF) address for each VM or leave it blank. If the field is blank, the tool provides an address when the configuration is saved. #. Add more VMs to the shared memory region by clicking **+** on the right side of an existing VM. Or click **-** to delete a VM. To add another shared memory region, click **+** on the right side of an existing region. Or click **-** to delete a region. .. image:: images/configurator-ivshmem02.png :align: center :class: drop-shadow Learn More ********** ACRN supports multiple inter-VM communication methods. For a comparison, see :ref:`inter-vm_communication`. For details on ACRN IVSHMEM high-level design, see :ref:`ivshmem-hld`.