QEMU源码分析-外设模拟(以GPIO为例)
本文最后更新于:4 个月前
QEMU模拟外设的原理
QEMU主要是实现了CPU核的模拟,可以读写某个地址。
QEMU的模拟外设的原理很简单:硬件即内存。
要在QEMU上模拟某个外设,思路就是:
- CPU读某个地址时,QEMU模拟外设的行为,把数据返回给CPU
- CPU写某个地址时,QEMU获得数据,用来模拟外设的行为。
即:要模拟外设备,我们只需要针对外设的地址提供对应的读写函数即可。
以GPIO为例:

QEMU 为GPIO内存地址提供读写回调函数,
1 | |
给外设地址提供读写函数
怎么描述某段地址:基地址、大小?如何给这段地址提供读写函数呢?这段地址设置好后,如何添加进system_memory去?有2种方法。
法1:memory_region_init_io/memory_region_add_subregion
以SIFIVE_UART为例,
1 | |
memory_region_init_io函数初始化iomem,读写函数,大小。memory_region_add_subregion函数s->iomem指定了基地址,并添加进system_memory中。
以后,客户机上的程序读写这块地址时,就会导致对应的读写函数被调用。
法2:memory_region_init_io/sysbus_init_mmio/sysbus_mmio_map
以SIFIVE_GPIO为例,
1 | |
memory_region_init_io函数初始化iomem,读写函数,大小。sysbus_init_mmio将mmin传给设备;
1 | |
sysbus_mmio_map从设备中吧mmio添加进system_memory并指定基地址。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!