奇怪的是我通过在写入设备之前在RTEMS中注释了cmdA和cmdB的endian转换来解决这个问题。(这对于endian转换是好的。我不知道)所以它几乎正在工作。 无论如何,这里有一个关于在QEMU处理器中交换CPU写/读数据和提供的技巧。 在QEMU中,每个设备模型都提供写入和读取功能,它还指定了如何将字传送到设备或从设备传送有关字节序的信息。它如下所示。
static const MemoryRegionOps lan9118_mem_ops = { .read = lan9118_readl, .write = lan9118_writel, .endianness = DEVICE_NATIVE_ENDIAN, };
以下是我从Peter Meydell收到的来自qemu-discuss@nongnu.org邮件列表的电子邮件副本。
------------------------
这取决于内存区域的MemoryRegionOps结构将其.endianness字段设置为什么。 DEVICE_NATIVE_ENDIAN表示设备看到的值与guest虚拟机CPU的本机字节序[*]的方式相同,因此如果guest虚拟机执行32位写入0x12345678,则它在write函数的参数中显示为0x12345678。 DEVICE_BIG_ENDIAN表示如果CPU是小端,那么该字将被字节删除。 DEVICE_LITTLE_ENDIAN表示如果CPU是大端,那么该字将被字节删除。后者对于具有与CPU的特定字节序不同的设备或总线非常有用(例如,PCI总是小端)。