serial.c - SerialState 中的寄存器变量如何映射到客户机内存?

serial.c - How do register variables in SerialState get mapped to guest memory?

我目前正在诊断一个问题,我的来宾正在尝试轮询 LSR 以清除 THRE,以便它可以输出到 UART 设备。但是,LSR 永远不会更新,因此它会无限期地轮询。我在我的轻度定制 mipssim 板上使用 serial_mm_init()

我正在尝试追溯源代码以找到应该更新 LSR 的位置,但我所看到的与该寄存器相关的所有内容都是 SerialState 结构中的 uint8_t lsr;我找不到将该变量映射到来宾内存的任何内容。

有人可以解释一下 SerialState 的值是如何映射到来宾内存的吗?

好吧,经过大量的努力,我让 UART 工作了。问题的答案在于 serial_ioport_read()serial_ioport_write() 函数。这两个方法被分配为 QEMU 在读取数据或将数据写入串行设备的 MemoryRegion 时调用的回调(在 serial_init()serial_mm_init() 中初始化)。这些函数对地址(作为 addr 传递到函数中)做一些掩码以确定正在引用哪个寄存器,然后 return 来自与该寄存器对应的 SerialState 结构的值.它非常简单,但我想一旦你弄明白了,一切似乎都很简单。最大的转折点是认识到 QEMU 有效地将串行设备实现为具有在内存操作时触发的特殊功能的 MemoryRegion

无论如何,希望这能帮助将来的人避免我经历的噩梦。干杯!