QEMU中挂载vTPM 笔记.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
QEMU中挂载vTPM 笔记

QEMU中挂载vTPM步骤 在Qemu的/hw目录下添加vTPM.c文件,步骤如下:首先定义vTPM的设备管理结构体,其中包含设备名称、设备描述、初始化函数和读写配置文件函数。增加了保存新PCI 设备的状态数据结构vTPMState static PCIDeviceInfo vTPM_info={ .qdev.name=“vTPM”, //定义设备名称 .qdev.desc=“vTPM for QEMU”, //设备描述 .qdev.size=sizeof(vTPMState), //vTPM状态结构大小,用于保存其状态数据 .init=vTPM_init, //定义PCI设备初始化函数,初始化PCI各种属性 .config_write = pci_ hardware_manager _write_config, .config_read = pci_ hardware_manager _read_config, }; typedef struct vTPMState_t{ //PCI设备信息 PCIDevice *pci_dev; //TPM状态,可用/不可用,激活/未激活,占有/未占有的状态组合 Unsigned char status; //传输包 Unsigned char buf[TPM_MAX_DATA]; uint32_t addr; uint8_t index; uint8_t status; uint32_t offset; uint8_t buf[TPM_MAX_PKT]; } vTPMState; vTPM_init函数会在QEMU开启的时候统一调用。vTPM_init用于初始化vTPM属性,包括设置PCI的厂商ID号(vendor_id)和设备ID号(device_id),PCI bar空间的大小以及端口映射函数vTPM_map等,在vTPM_map函数中注册对vTPMState的读写函数。 在QEMU中,在初始化我们的硬件设备的时候需要注册我们的IO空间,对于PCI设备来说,IO地址注册就要多一步,因为要进行PCI bar地址与IO的映射,所以必须先调用下面函数来给bar注册PCI地址(给bar分配IO地址)。 原函数:void pci_register_bar(PCIDevice *pci_dev, int region_num, ??????????????????????????? pcibus_t size, int type, ??????????????????????????? PCIMapIORegionFunc *map_func); 第一个参数是PCI设备指针;第二个参数是bar的编号,每个PCI设备有6个bar,对应0-5,也就是6个region;第三个是分配的IO地址空间范围;第四个参数表示IO类型是PIO还是MMIO;最后一个参数是我们要进行IO读写映射函数指针。 我们可以发现这里并没有给设备分配IO空间的基地址,只有一个空间长度而已,这也进一步说明PCI设备在QEMU中一般是随机动态分配空间的,通过不断的updatemapping来不断更新IO空间的映射。 static void map_func(PCIDevice *pci_dev,int region_num,?pcibus_t addr,pcibus_t size,int type); 第一个依然是PCI设备指针,第三个是PCI地址映射的PIO起始地址,这个起始地址是在我们注册PCI地址的时候,PCI总线通过计算比较PIO地址空间得到的一个PIO地址起始空间,所以这里不能够随便的改变,因为PCI地址空间需要和PIO空间进行映射。所以在我们注册设备PIO空间的时候必须将这个地址作为注册IO空间的起始地址。这个函数是在更新bar映射的时候被调用的,实际上它的作用就是给PCI设备安装IO读写函数,能够操作IO 调用QEMU的pci_regiser_bar注册PCI 地址 pci_regiser_bar(pci_dev,0,SIZE,PCI_BAR_ADDRESS_SPACE_IO, vTPM_map); PCI_BASE_ADDRESS_SPACE_IO (别人) 实现映射函数,PCI bar地址初始化以后会将映射IO的起始地址作为start_addr参数传到映射函数,然后通过之前的register函数注册IO地址空间,在这个操作以后,一旦这些位的IO发生读写,虚拟机就会产生VM-exit,进而我们的ioread和iowrite就能够被调用。 //在vTPM_map函数中调用QEMU的register_ioport_write注册对vTPMState的写函数, 调用QEMU的re

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档