> 文章列表 > ivshmem(Inter-VM shared memory)设备规范

ivshmem(Inter-VM shared memory)设备规范

ivshmem(Inter-VM shared memory)设备规范

目录

1. 规范

1.1 简介

1.2 配置ivshmem PCI设备

1.3 ivshmem Guest PCI设备接口

1.4 PCI BARs规范

BAR0

BAR1

BAR2

2. 应用场景

2.1 共享内存

2.2 中断事件通知机制

3. Ivshmem PCI设备工作机制

3.1 PCI BAR0寄存器

4. 设计与实现

4.1 ivshmem-server

4.2 ivshmem client与server通信协议

4.3 ivshmem client与client通信协议


1. 规范

1.1 简介

虚拟机间共享内存设备ivshmem (Inter-VM shared memory device)设计用于共享运行不同客户机的多个QEMU进程以及与宿主机之间的内存区域。为了让所有的Guest虚拟机都能访问共享内存区域,QEMU将该设备建模为一个PCI设备,将共享内存作为PCI的BAR空间。

ivshmem设备可以直接使用宿主机上的共享内存对象(内存映射的文件、内存设备、内存大页等),也可以从一个ivshmem server获取共享内存。当使用ivshmem server时,该设备可以与共享内存对象的多个对端建立中断通信机制。

1.2 配置ivshmem PCI设备

目前支持两种基础的配置方式:

  • 单共享内存
-device ivshmem-plain,memdev=HMB,...

使用内存设备HMB作为ivshmem设备的共享内存区域。

  • 共享内存+中断机制
-device ivshmem-doorbell,chardev=CHR,vectors=N,...

该场景必须有一个宿主机上的ivshmem server,ivshmem设备会连接到unix socket字符设备的该server上。ivshmem server会为每一个ivshmem设备分配一个唯一的ID(0-65535)。中断使用MSI-X(message-signaled)机制,vector=N用于配置MSI-X使用的vectors数量。

1.3 ivshmem Guest PCI设备接口

  • 厂商ID:1af4
  • 设备ID:1110
  • revision号:在QEMU 2.6.0之前为0, 之后为1。

1.4 PCI BARs规范

Ivshmem PCI设备有2个或3个BAR寄存器。

  • BAR0

设备寄存器(256B的MMIO)

  • BAR1

MSI-X表和PBA(ivshmem-doorbell)

  • BAR2

用作映射的共享内存对象

2. 应用场景

2.1 共享内存

共享宿主机上的内存,使用BAR2。使用场景示例:memic( http://dpdk.org/browse/memnic)。

2.2 中断事件通知机制

使用BAR0和BAR1提供内存共享两端的事件通知机制(基于中断),Guest需要写kernel驱动以支持中断的处理。

当配置中断时,中断的多端之间共享eventfd对象,利用eventfd对象(ivshmem-server管理)完成事件的通知机制。

3. Ivshmem PCI设备工作机制

3.1 PCI BAR0寄存器

偏移

大小

访问权限

重置值

功能

0

4

rw

0

中断掩码

(Interrupt Mask)

bit 0: peer interrupt (rev 0)

reserved (rev 1)

bit 1..31: reserved

4

4

rw

0

中断状态

(Interrupt Status)

Bit 0: peer interrupt (rev 0)

Bit 1..31: reserved

8

4

read-only

0 或 ID

IVPosition

12

4

write-only

N/A

Doorbell

Bit 0 .. 15: vector

Bit 16 .. 31: peer ID

16

240

none

N/A

reserved

  • 在revision 0版本的设备中,中断状态和中断掩码寄存器共同控制着legacy INTx中断(当设备不支持MSI-X时)。INTx在中断状态和中断掩码与操作非0时,产生中断。在共享内存的对端存在中断请求时,中断状态寄存器bit0置位为1,读该寄存器会清零。
  • IVPosition寄存器:在设备不配置中断时为0,否则为设备的ID(0-65535)。当为0时,无法区分该设备是否使能了中断,还是标识了设备ID为0。
  • Doorbell寄存器:写该寄存器会发起一个中断对端的请求,写的高16bit标识设备ID,低16bit是中断vector。如果该设备未配置中断,则该写被忽略。

4. 设计与实现

4.1 ivshmem-server

Server监听在一个Unix socket上,每一个连接到server的client,server都会:

  • 为该client分配一个ID
  • 创建一个eventfd句柄对象,用作中断事件通知
  • 发送peer ID和eventfd句柄给client
  • 发送当前client的事件通知信息(eventfd句柄)给其他client(peer)
  • 发送其他client(peer)的事件通知信息(eventfd句柄)给当前连接的client
  • 发送中断建立消息给当前client()

4.2 ivshmem client与server通信协议

目前,配置中断机制的ivshmem设备必须连接到一个外部的ivshmem-server上(QEMU有一个示例实现)。连接是client到server单向的,消息传送是server到client单向的。每个消息由一个8字节的小端有符号数字组成,同时可能附带一个SCM_RIGHTS的句柄(传送eventfd句柄)。

  • 连接协议(按序)
    • 1)server发送一个协议版本(目前0),在协议版本不匹配时,client关闭连接
    • 2)server发送分配给client的peer ID,唯一且范围在0 ~65535之间(doorbell寄存器只提供16位长度传输peer ID)。
    • 3)server发送-1,并通过SCM_RIGHTS发送共享内存对象句柄给client。
    • 4)server发送连接通知给其他已经存在的clients(peers)。主要包括新client的peer ID数字和新client共享的eventfd句柄给所有已经存在的peers。其他peers会将接收到的peer ID和eventfd句柄匹配成一对儿中断向量表项(vector[peerID]=eventfd),以此建立两个peer之间的事件通知机制。
    • 5)server发送中断建立信息给当前client。主要包括新client的peer ID数字和每一个其他clients(peers)的共享eventfd句柄给当前新的client,有几个其他peers,就发送几个(peerID, eventfd[i])对儿。用作当前client接收其他peers的中断通知机制的建立。
  • 后续协议(按序)
    • 新连接与断链通知
      • 收到server发送的peerID,和eventfd句柄,则表明有新的client(peer)加入(连接协议中的4))。
      • 收到server发送的peerID,和-1句柄,则表明某个client(peer)断开server,当前client删除其事件通知句柄(中断向量机制)。

4.3 ivshmem client与client通信协议

配置中断通知机制的client(ivshmem共享内存的客户端设备),会收到其他client(peers)的共享eventfd句柄,主要用于中断通知其他peers。同样,也通过eventfd句柄接收到其他peers的中断通知。

  • 中断其他peer:设备写一个8字节的1到某个peer的eventfd(其Interrupt vector)
  • 接收其他peer的中断:从其他peer的eventfd(Interrupt vector)中读并丢弃尽量多的8字节的整数

关于作者:

犇叔,浙江大学计算机科学与技术专业,研究生毕业,而立有余。先后在华为、阿里巴巴和字节跳动,从事技术研发工作,资深研发专家。主要研究领域包括虚拟化、分布式技术和存储系统(包括CPU与计算、GPU异构计算、分布式块存储、分布式数据库等地方)、高性能RDMA网络协议和数据中心应用、Linux内核等方向。

专业方向爱好:数学、科学技术应用

关注犇叔,期望为您带来更多科研领域的知识和产业应用。

内容坚持原创,坚持干货有料。坚持长期创作,关注犇叔不迷路

转载请附带本文连接,标注转载。