libusb_control_transfer 使用 Vmware Workstation 非常慢

libusb_control_transfer very slow with Vmware Workstation

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

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

问题是使用 libusb_control_transfer 函数的通信比我 运行 在 Ubuntu 上不使用 vmware 时慢 20 倍 例如,发送 180KB 需要我大约 20 秒Vmware Workstation 但是,当我在没有 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 中使用它慢得多?
有人可以建议如何解决这个问题吗?

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

您不能期望 VM 运行 具有与本机机器相同的性能 - 在像 ESX 这样的 bare-metal 管理程序上甚至都不是这样,它甚至没有主机操作系统的额外成本...除非您仅使用 CPU、RAM、SATA 磁盘和网络 - 所有这些设备都可以轻松地在应用程序之间“共享”,这就是 bare-metal 上的虚拟服务器的原因管理程序 运行 非常好,特别是如果它们为每台服务器(有时甚至是它们自己的网卡)使用专用的物理大容量存储。

resources/hardware 开始变得更加复杂,它具有 exclusive/expensive 访问权限:GPU/屏幕、声卡、通信端口(从串口到 USB,通过并口)、光驱/慢速磁盘、一般人机界面设备(鼠标、键盘等)等

也就是说你的执行路径,大致是:VM application (VM user) -> VM drivers (VM kernel) -> VM VMWare bridges (VM kernel) -> Host VMWare bridges (Host user) - > 主机 VMWare 应用程序(主机用户)-> 主机驱动程序(主机内核)-> 硬件。

然后,添加 return 获取确认和读取数据的路径... 请注意,有些步骤可以很简单 pass-through 包装器,因此它们可以相当快,但仍然有很多步骤...

“有点”长于:应用程序(用户)-> OS 驱动程序(内核)-> 硬件 - 本机应用程序会发生什么。

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