



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QEMU中挂载vTPM步骤在Qemu的/hw目录下添加vTPM.c文件,步骤如下:首先定义vTPM的设备管理结构体,其中包含设备名称、设备描述、初始化函数和读写配置文件函数。增加了保存新PCI 设备的状态数据结构vTPMStatestatic PCIDeviceInfo vTPM_info=.=“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 bufTPM_MAX_DATA; uint32_t addr;uint8_t index;uint8_t status;uint32_t offset;uint8_t bufTPM_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的register_ioport_read注册对vTPMState的读函数static void vTPM_map(PCIDevice *pci_dev,int region_num,pcibus_t start_addr,pcibus_t size,int type) vTPMState *s = DO_UPCAST(vTPMState,dev,pci_dev); register_ioport_write(start_addr,length,size,vTPM_state_write,s); register_ioport_read(start_addr,length,size, vTPM_state_read,s);实现vTPM的管理结构的注册函数;static void vTPM_register_devices(void)pci_qdev_register(&vTPM_info); /*注册设备结构*/将vTPM添加到QEMU设备列表中; device_init(vTPM_register_devices); /*设备添加到QEMU设备列表*/当PCI设备结构都构造以后,就可以将vTPM挂载到PCI桥上; pci_create_simple_multifunction (pci_bus,-1,true, vTPM);备注:如下:外设中的寄存器被称为I/O端口,外设中的内存被称为I/O内存。二者合起来统称为I/O空间。1.访问I/O内存(I/O内存必须映射到内存空间)的流程是:request_mem_region() - ioremap() - ioread8()/iowrite8() - iounmap() - release_mem_region() 。前面说过,IO内存是统一编址下的概念,对于统一编址,IO地址空间是物理主存的一部分,对于编程而言,我们只能操作虚拟内存,所以,访问的第一步就是要把设备所处的物理地址映射到虚拟地址,Linux2.6下用ioremap(): void *ioremap(unsigned long offset, unsigned long size); ioremap()用来将IO资源的物理地址映射到内核虚地址空间(3GB - 4GB)中,参数addr是指向内核虚地址的指针。然后,我们可以直接通过指针来访问这些地址,但是也可以用Linux内核的一组函数来读写: ioread8(), iowrite16(), ioread8_rep(), iowrite8_rep(). 2.访问IO端口有2种途径(对于独立编址系统体系): I/O映射方式(I/Omapped)、内存映射方式(Memorymapped)。前一种途径不映射到内存空间,直接使用 intb()/outb()之类的函数来读写IO端口;后一种MMIO是先把IO端口映射到IO内存(“内存空间”),再使用访问IO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿写话:我的小伙伴和我(8篇)
- 销售流程跟进表专业级工具模板
- 农产品价格稳定合作协议
- 商业广告代理合同及宣传协议
- 物业管理合同模板及收费标准说明
- 春节八年级作文1000字7篇
- 农产品进销存信息化平台合作
- 非语言沟通技能与职场应用
- 人工湿地基质与植物组合对污染物去除效率的影响机制与优化策略研究
- 地产活动市场竞争分析报告
- 人身保险整本书课件电子教案全套课件教学教程
- 2024-2025年中国中小银行行业深度分析及投资规划研究建议报告
- 2024至2030年网络安全预警系统项目投资价值分析报告
- 2025年成人高考政治(专升本)考试题库
- 《LOGO标志设计》课件
- 设计经理招聘笔试题与参考答案(某大型央企)2024年
- 土方出土合同模板
- 水库周边绿化养护方案
- 井下皮带运输机事故专项应急预案
- 北师大版六年级数学上册《百分数的认识》教学设计
- 2023八年级数学上册 第七章 平行线的证明4 平行线的性质教案 (新版)北师大版
评论
0/150
提交评论