代码之家  ›  专栏  ›  技术社区  ›  vtable

使用Vmware Workstation时,libusb_控制_传输速度非常慢

  •  0
  • vtable  · 技术社区  · 4 年前

    我使用libusb使用 libusb_control_transfer 函数将信息发送到USB设备。

    我的主机是WINDOWS 10,来宾是Vmware Workstation版本16.2.3中的Ubuntu 20.04。

    问题是使用 libusb_控制_传输 这个函数比我在不使用vmware的情况下在Ubuntu上运行要慢20倍。例如,使用vmware Workstation发送180KB的数据需要20秒,但在不使用vmware Workstation的情况下发送数据需要1-2秒。

    我确保在设置中正确设置了USB->USB控制器。

    ldd myBinary :
        linux-vdso.so.1
        libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
        libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 
        /lib64/ld-linux-x86-64.so.2 
    

    我的问题是:
    为什么在Vmware Workstation中使用libusb_control_transfer要比在没有VM的Ubuntu中使用慢得多?
    有人能推荐一个解决方法吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Wisblade    4 年前

    你在虚拟机中。虚拟机中“插入”的所有硬件都会(以某种方式)桥接到主机操作系统,这需要花费时间。

    你不能期望VM以与本机相同的性能运行——甚至在ESX这样的裸机虚拟机监控程序上都不是这样,它甚至没有主机操作系统的额外成本。。。除非您只使用CPU、RAM、SATA磁盘和网络,否则所有这些设备都可以轻松地在应用程序之间以本机方式“共享”,这就是为什么裸机虚拟机监控程序上的虚拟服务器运行得非常好的原因,尤其是如果它们为每台服务器(有时甚至是它们自己的网卡)使用专用物理大容量存储的话。

    对于具有独占/昂贵访问权限的资源/硬件来说,它开始变得更加复杂:GPU/屏幕、声卡、通信端口(通过并行端口从串行到USB)、光驱/慢速磁盘、一般的人机界面设备(鼠标、键盘等),等

    这意味着您的执行路径或多或少是:VM应用程序(VM用户)——>虚拟机驱动程序(虚拟机内核)>虚拟机VMWare桥接器(虚拟机内核)>主机VMWare网桥(主机用户)->;主机VMWare应用程序(主机用户)->;主机驱动程序(主机内核)->;硬件

    然后,添加返回路径以获取确认和读取数据。。。 请注意,有些步骤可以是简单的直通包装,所以它们可以非常快,但仍然有很多步骤。。。

    “稍”长于:应用程序(用户)——>操作系统驱动程序(内核)>硬件——本机应用程序就是这样。

    对于USB,情况可能更糟,因为驱动程序部分位于用户区(USB设备驱动程序本身),部分位于内核区(USB控制器)。因此,与大多数驱动程序相比,与大多数其他硬件相比,您还有一层需要跨越。在来宾操作系统和主机操作系统上都实现了这一点。