当前位置: 首页 > news >正文

[qemu+kvm]: smmu stage 2 建立流程

1. qemu倡导 gpa和hpa映射关系在vm建立时不确定,在运行时触发缺页异常后建立映射关系(lazy binding)。
2. smmu stage 2要求 gpa和hpa的映射关系在vm建立时确定,若在运行时触发缺页,会导致dma失败(pcie ats 除外)
两者有冲突,那么 qemu 对于smmu stage 2 、mmu stage 2 (ept)建立到底是怎样的?

1.smmu stage2建立过程 对于vfio设备,有自己专属的MemoryListenerstaticconstMemoryListener vfio_memory_listener={.name="vfio",.region_add=vfio_listener_region_add,.region_del=vfio_listener_region_del,.log_global_start=vfio_listener_log_global_start,.log_global_stop=vfio_listener_log_global_stop,.log_sync=vfio_listener_log_sync,};

注册: hw/vfio/common.c

memory_listener_register(&container->prereg_listener,&address_space_memory);

此MemoryListener的address_space_memory和ddr mem 相同,所以当ddr mem增加时,vfio_listener_region_add会被调用。

通过memory_region_get_ram_ptr拿到hva,通过section->offset_within_address_space 获得iova, 将两个参数传入vfio_dma_map
vfio_dma_map调用ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map)进入内核做映射
进入内核:
vfio_pin_map_dma

vfio_iommu_map会做真正的map 工作,调用 arm_smmu_ops->map,建立 smmu stage 2页表,
但在此之前已经得到了pfn, pfn是通过vfio_pin_pages_remote获取的,所以vfio_pin_pages_remote职责是分配物理页,建立hva和hpa 的映射关系。

staticlongvfio_pin_pages_remote(structvfio_dma*dma,unsignedlongvaddr,longnpage,unsignedlong*pfn_base,unsignedlonglimit,structvfio_batch*batch){ret=vaddr_get_pfns(mm,vaddr,req_pages,dma->prot,&pfn,batch->pages);}`在这里插入代码片`

vaddr_get_pfns:

staticintvaddr_get_pfns(structmm_struct*mm,unsignedlongvaddr,longnpages,intprot,unsignedlong*pfn,structpage**pages){ret=pin_user_pages_remote(mm,vaddr,npages,flags|FOLL_LONGTERM,pages,NULL);retry:vma=vma_lookup(mm,vaddr);if(vma&&vma->vm_flags&VM_PFNMAP){ret=follow_fault_pfn(vma,mm,vaddr,pfn,prot&IOMMU_WRITE);}

比较清晰了:通过pin_user_pages_remote 建立 hva到hpa的映射,同时follow_fault_pfn是个兜底机制;
把映射关系放到task_struct->mm下;
2. mmu stage 2 建立过程
因为smmu stage 2已经建立,hva和hpa映射关系已经明确了,同时gpa 和hva的关系在vm建立初期就明确了(hva = section_base + gpa),所以gpa和hpa的关系已经明确, 那么mmu 在触发 mmu stage 2 缺页时,只需要创建gpa到hpa的页表就行了,不需要额外分配hpa。

mmu stage2 缺页进入 user_mem_abort:

staticintuser_mem_abort(structkvm_vcpu*vcpu,phys_addr_tfault_ipa,structkvm_memory_slot*memslot,unsignedlonghva,bool fault_is_perm){pfn=__gfn_to_pfn_memslot(memslot,gfn,false,false,NULL,write_fault,&writable,NULL);ret=kvm_pgtable_stage2_map(pgt,fault_ipa,vma_pagesize,__pfn_to_phys(pfn),prot,memcache,KVM_PGTABLE_WALK_HANDLE_FAULT|KVM_PGTABLE_WALK_SHARED);}

__gfn_to_pfn_memslot负责找到gpa 对应的hpa, kvm_pgtable_stage2_map负责建立 mmu stage 2 映射
__gfn_to_pfn_memslot:

kvm_pfn_t__gfn_to_pfn_memslot(conststructkvm_memory_slot*slot,gfn_tgfn,bool atomic,bool interruptible,bool*async,bool write_fault,bool*writable,hva_t*hva){hva_to_pfn(addr,atomic,interruptible,async,write_fault,writable);}

hva_to_pfn:

kvm_pfn_thva_to_pfn(unsignedlongaddr,bool atomic,bool interruptible..{if(hva_to_pfn_fast(addr,write_fault,writable,&pfn))returnpfn;if(atomic)returnKVM_PFN_ERR_FAULT;npages=hva_to_pfn_slow(addr,async,write_fault,interruptible,writable,&pfn);}```hva_to_pfn_fast 快速路径,由于建立smmu stage2 时,hva和hpa的关系已经明确,所以这里走快速路径 hva_to_pfn_slow慢速路径,如果guest没有透传设备,每当guest访存时,都要走慢速路径,现场分配pfn。 函数细节有空展开分析。流程、原理已经说清楚了。
http://www.jsqmd.com/news/856511/

相关文章:

  • 如何高效管理Windows右键菜单:ContextMenuManager专业配置指南
  • 大模型选型生死线:Perplexity指标必须在24小时内完成这6项交叉验证,否则准确率偏差超±37%
  • 国产赛车硬刚欧美强队?Gensors DAM 应力应变数据采集系统讲透造车真相
  • 基于智能体的企业级自主决策与业务运营平台解决方案:AI智能管理驾驶舱、智能管理驾驶舱的四大功能定位、总体方案蓝图、总体规划方案
  • 硅光芯片设计避坑指南:行波MZM调制器仿真中速度失配与损耗的权衡实战
  • 2026年4月贵州评价高的出门纱租赁门店推荐,礼服租赁/男士西服定制/秀禾服租/成人礼礼服租赁,出门纱租赁展厅测评 - 品牌推荐师
  • 马氏体钢1700MS激光焊接热-冶金-力学耦合数值模拟方法【附代码】
  • 从‘黑盒’测试到电路设计:互易定理在排查传感器信号异常时的实战应用
  • 贴片机如何提升电子制造行业的生产效率与质量
  • Sora 2原生导入Blender 4.2:3步实现动态提示词驱动骨骼绑定与物理模拟(附实测FBX+USDZ双通道转换参数表)
  • 金融数据宝藏:期货五档Tick与期权高频数据详解
  • 芜湖装修公司推荐哪家
  • 别再只用SE和CBAM了!手把手教你将轻量级ELA注意力模块集成到ResNet/MobileNet中
  • [特殊字符] 告别类名地狱!Tailwind CSS 语义化转换神器来了
  • SystemVerilog中logic数据类型:编译期捕获多驱动错误的核心优势
  • 仅限首批500名开发者:Perplexity图谱查询性能压测报告(含17.3万节点实测TPS基准数据)
  • 【2026 最新】Kali Linux 零基础教程|超详细!下载 + 安装 + 使用全搞定✅
  • CANoe Panel面板实战:3个真实车载测试场景教你玩转ComboBox和TextBox
  • 2026年5月降AI率工具实测,知网AI率36%降到3%的方法
  • 【独家首发】Perplexity未公开的验证日志埋点规范(含47个关键trace字段定义),首批获准接入团队已落地风控提效41%
  • 优质小区标牌设计怎么选?靠谱专业厂家认准合肥原野标识,园区标牌/校园标牌/文化设计/标识制作,标牌设计团队怎么选择 - 品牌推荐师
  • 光纤弯曲损耗原理、测试与工程规避实战指南
  • 深聊专业交通事故律师,哪家性价比高且口碑 - 工业品牌热点
  • Day3|体虚人群的养生执念:恒温饮水机,如何一年四季守住身体温度? 系列专栏|2026 AI烟火日常·003期
  • 基于粒子群算法优化Simulink PID控制器参数:原理、实现与工程实践
  • 记一次前端逻辑绕过登录到内网挖掘
  • QT中控件qss样式修改
  • LDO和DC-DC怎么选,效率与噪声如何取舍
  • 讲讲百存建设科研投入大吗、售后如何、创新能力强不强 - 工业品牌热点
  • 程序员单人创业日记·Day8|承接第一笔定制订单!24分钟搞定视频格式转换,终于明白技术变现有多简单