首页 > 解决方案 > QEMU PCI 内存映射 I/O

问题描述

我试图了解 USB PCI MMIO 并将 QEMU 用作游乐场。

以下设备在我的虚拟机上,

00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03) (prog-if 00 [UHCI])
    Subsystem: Red Hat, Inc. QEMU Virtual Machine
    Flags: bus master, fast devsel, latency 0, IRQ 16
    I/O ports at c0a0 [size=32]
    Kernel driver in use: uhci_hcd

00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03) (prog-if 00 [UHCI])
    Subsystem: Red Hat, Inc. QEMU Virtual Machine
    Flags: bus master, fast devsel, latency 0, IRQ 17
    I/O ports at c0c0 [size=32]
    Kernel driver in use: uhci_hcd

00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03) (prog-if 00 [UHCI])
    Subsystem: Red Hat, Inc. QEMU Virtual Machine
    Flags: bus master, fast devsel, latency 0, IRQ 18
    I/O ports at c0e0 [size=32]
    Kernel driver in use: uhci_hcd

00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03) (prog-if 20 [EHCI])
    Subsystem: Red Hat, Inc. QEMU Virtual Machine
    Flags: bus master, fast devsel, latency 0, IRQ 19
    Memory at fc072000 (32-bit, non-prefetchable) [size=4K]
    Kernel driver in use: ehci-pci

和下面的代码,

int fd = open("/sys/devices/pci0000:00/0000:00:1d.7/resource0", O_RDWR | O_SYNC);
int mmio = mmap(0, 0x100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
iopl(3);
outl(0, 0xc0a0);

如果我不包括在内outl(0, 0xc0a0);,似乎对 MMIO 地址空间的任何写入都不会触发任何事情。

希望尝试并了解究竟outl(0, 0xc0a0);实现了什么。

标签: usbqemupci

解决方案


outl()写入数据。在您的代码中,没有其他函数写入 I/O,除了outl()

https://linux.die.net/man/2/outl

如果您想了解有关outl使用gdb的更多内部信息并对其进行反汇编https://gist.github.com/jarun/ea47cc31f1b482d5586138472139d090

https://man7.org/linux/man-pages/man2/iopl.2.html


推荐阅读