qemu设备模拟讲述.docxVIP

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
qemu设备模拟讲述

设备模拟目的 我们好像不会干一件事而毫无目的,就算不停刷微信朋友圈也是为了打发你无聊的时间。 其实最装B的回答是:设备模拟的目的就是模拟设备。这话是屁话,不过也能说明些什么,确实是模拟设备,用软件的方式提供硬件设备具备的功能。 对于和PC机交互的硬件设备,主要要干两件事,一是提供IRQ中断,二是响应IO输入输出。IO包括PIO/MMIO/DMA等(DMA算不算IO?) 以i8254.c实现的pit为例,主要提供了IRQ注入和PIO响应,见初始化函数pit_initfn: static const MemoryRegionOps pit_ioport_ops = { .read = pit_ioport_read, .write = pit_ioport_write, .impl = { .min_access_size = 1, .max_access_size = 1, }, .endianness = DEVICE_LITTLE_ENDIAN, }; static int pit_initfn(PITCommonState *pit) { PITChannelState *s; s = pit-channels[0]; /* the timer 0 is connected to an IRQ */ //这里有个irq_timer,用于qemu_set_irq提供中断注入 s-irq_timer = qemu_new_timer_ns(vm_clock, pit_irq_timer, s); qdev_init_gpio_out(pit-dev.qdev, s-irq, 1); memory_region_init_io(pit-ioports, pit_ioport_ops, pit, pit, 4); qdev_init_gpio_in(pit-dev.qdev, pit_irq_control, 1); return 0; } Static const MemoryRegionOps pit_ioport_ops={ ????.read=pit_ioport_read, ????.write=pit_ioport_write, ????.impl={ ????????.min_access_size=1, ????????.max_access_size=1, ????}, ????.endianness=DEVICE_LITTLE_ENDIAN, }; ? Static int pit_initfn(PITCommonState * pit) { ????PITChannelState*s; ? ????s=pit-channels[0]; ????/* the timer 0 is connected to an IRQ */ ????//这里有个irq_timer,用于qemu_set_irq提供中断注入 ????s-irq_timer=qemu_new_timer_ns(vm_clock,pit_irq_timer,s); ????qdev_init_gpio_out(pit-dev.qdev,s-irq,1); ? ????memory_region_init_io(pit-ioports,pit_ioport_ops,pit,pit,4); ????qdev_init_gpio_in(pit-dev.qdev,pit_irq_control,1); ????return0; }这里的pit_ioport_ops,主要注册GUEST操作系统读写PIO时候的回调函数。 模块注册 QEMU要模拟模块那么多,以程序员的喜好,至少得来一套管理这些模拟设备模块的接口,以示设计良好。 QEMU将被模拟的模块分为了四类: typedef enum { MODULE_INIT_BLOCK, MODULE_INIT_MACHINE, MODULE_INIT_QAPI, MODULE_INIT_QOM, MODULE_INIT_MAX } module_init_type; typedefenum{ ????MODULE_INIT_BLOCK, ????MODULE_INIT_MACHINE, ????MODULE_INIT_QAPI, ????MODULE_INIT_QOM, ????MODULE_INIT_MAX }module_init_type;BLOCK 比如磁盘IO就属于BLOCK类型,e.g: block_init(bdrv_qcow2_init); block_init(iscsi_block_init); MACHINE PC虚拟machine_init(pc_machine_init); XEN

文档评论(0)

jiayou10 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档