QEMU+OVMF使用ACPI timer延时的原理

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

QEMU+OVMF使用ACPI timer延时的原理

当启动qemu的参数存在-M "pc"时,QEMU会模拟Intel 82441FX设备获取PMIO bar

摘要: QEMU 模拟 ACPI PM 计时器,OVMF 读取 3.58MHz 计数器实现微秒级忙等延时,分辨率约 0.28µs、长期无漂移,但短延时受 VM exit 抖动影响,适合固件场景。

,其底层机制和延时准确性分析如下:

1. 延时机制回顾(基于 i440fx/PIIX4)

  1. PEI 阶段 MiscInitialization()​ 判定为 i440fx 后,把 PIIX4 PMBA 编程为 0xB000(PIIX4\_PMBA\_VALUE),使能 ACPI PM I/O。
  2. DxeAcpiTimerLib​ 构造函数 由 PCD 判定平台后缓存 IO 地址:mAcpiTimerIoAddr = PMBA + ACPI_TIMER_OFFSET (0x8)​,即 IO 端口 0xB008。
  3. InternalAcpiGetTimerTick()​ 就是一次 IoRead32 (0xB008)。
  4. MicroSecondDelay()​ 把微秒换算成 tick:ticks = µs × ACPI_TIMER_FREQUENCY / 1e6​,其中 ACPI\_TIMER\_FREQUENCY​ = 3,579,545 Hz。
  5. InternalAcpiDelay()​ 用"读当前计数值 → 算目标值 → CpuPause()​ 轮询等待"的忙等循环完成延时,并正确处理 24 位计数器的回绕(ACPI\_TIMER\_COUNT\_SIZE = 2²⁴)。

2. 精度(分辨率 / 量化误差)

  • 单 tick 周期 = 1 / 3,579,545 s ≈ 279.365 ns ≈ 0.279 µs,这是理论上能分辨的最小时隙。
  • 计数器是 24 位,范围 0~16,777,215,完整回绕周期 ≈ 16,777,216 / 3,579,545 ≈ 4.687 秒;循环用 BIT23 掩码(2²³ ≈ 2.34 s)分片处理长延时(InternalAcpiDelay()​ 的 Times = Delay >> 22)。
  • 延时被量化到整数 tick,且语义是"至少延时这么多"(函数注释明确 Stalls the CPU for at least...​)。所以实际延时 = 请求值 向上取整到下一个 tick,再加轮询开销。
  • 举例:请求 1 µs ≈ 3.58 tick,实际至少 4 tick ≈ 1.117 µs(误差约 +0.12 µs);请求 10 µs ≈ 35.8 tick,实际 ≥ 36 tick ≈ 10.06 µs。

理论精度结论:纯量化误差最大约 1 tick(0.28 µs) ,但由于是忙等轮询,实际还叠加了"读到目标 tick 之后的响应延迟",典型总超调约几百 ns 到几 µs 量级。对固件里常见的"等设备就绪 / 寄存器稳定"这类延时,这个量级完全足够。

3. 准确性(长期 / 平均)

  • QEMU 里这颗 PM 计时器(-M pc​ 的 ACPI PM 设备,位于 Bus0/Dev1/Func3)不是靠模拟真实晶振,而是直接用 QEMU 虚拟时钟(​​QEMU_CLOCK_VIRTUAL​​ )除以 tick 周期推导出计数值。也就是说,计数值与"客户机虚拟时间"严格绑定。
  • 在 KVM 加速、虚拟机正常运行时,虚拟时钟近似等于真实墙钟时间,因此长期来看平均频率误差接近 0,基本无漂移。这正是 PM 计时器相比 CPU 频率计时(TSC)的最大优点:延时与 CPU 主频无关,CPU 变频/换机也不影响。
  • 这也解释了为什么固件在不知道 TSC 频率的阶段(PEI 早期、S3 恢复等)优先用它。

4. 虚拟化环境下的实际抖动(精度打折扣的地方)

  • 每次读取都是一次 VM exit:IoRead32 (0xB008)​ 在 KVM 下要陷入到 QEMU 用户态再返回,单次往返约 0.5~2 µs(随硬件/负载浮动) 。延时越短,这个开销占比越大,抖动越明显。
  • TCG(纯软件模拟,无 KVM) 下虚拟时钟按翻译块执行推进,PM 计时器的有效粒度更粗、抖动更大;若开启 -icount 指令计数模式,虚拟时钟还退化为"按指令数",墙钟准确性会大幅下降。
  • 迁移、stop​/cont、快照恢复期间虚拟时钟冻结,PM 计时器也随之停走(这符合虚拟时钟语义,通常不是问题)。

5. 结论

维度表现
分辨率~279 ns/tick(24 位,回绕 4.687 s)
延时语义"至少"延时,短延时量化上取整,误差通常 +0.3~1 µs 量级
长期准确性由 QEMU 虚拟时钟驱动,KVM 正常运行下无漂移、频率准
短期抖动受 VM exit 往返(~µs)和轮询粒度影响,短延时/高实时场景抖动明显
适用性固件阶段 µs~ms 级"等设备/寄存器"延时非常合适;不适合 ns 级或对单次延时抖动极其敏感的场景

这套"i440FX PMIO + ACPI PM 计时器"的延时,精度(分辨率 ~0.28 µs、量化上取整)和长期准确性(无漂移)都很好,足够固件日常使用;但单次短延时的实际抖动受虚拟化 VM exit 开销和轮询粒度限制,达不到高精度计时/性能基准的级别。OVMF 把它用于需要与墙钟时间同步、与 CPU 频率解耦的延时,这正是它的设计定位。

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03 需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。 阅读详情

相关推荐

【智能体评测】BrowserUse:一款超越 Anthropic Computer Use 的开源智能体

本文将全面介绍 BrowserUse 的核心功能、配置与使用方法,以及通过多场景测试评估其性能。

surfirst的博客 4099

UEFI开发中的AI协作者:Claude Code如何成为调试器+规范翻译器

UEFI开发是嵌入式系统工程的核心能力,涉及固件启动流程、内存模型约束与硬件协议交互等底层知识。其本质不是通用编程,而是对PI规范、EDK II构建系统和OVMF虚拟环境的深度空间建模。传统大模型如Qwen或GLM-5虽具备强代码生成能力,但在UEFI场景下易陷入头文件缺失、协议绑定时序错误、物理地址映射失准等硬性陷阱;而Claude Code凭借上下文感知、主动质疑机制与规范级响应,能实时校验gBS调用合法性、拦截DMA误用风险、精准补全EFI_DRIVER_BINDING_PROTOCOL逻辑——这使其

weixin_34221073的博客 368

Glue)《Multi-omics single-cell data integration and regulatory inference with graph-linked embedding》

论文引入GLUE框架,通过知识引导图(guidance graph)显式建模跨层调控交互,桥接特征空间,实现准确、鲁棒、可扩展的整合。近年来,单细胞测序技术(如scATAC-seq用于染色质可及性、snmC-seq用于DNA甲基化、scRNA-seq用于转录组)允许同时探测多个组学层,揭示细胞异质性和调控机制。GLUE优于现有方法:桥接特征空间,避免信息丢失,支持多组学和调控推断。用于整合未配对的单细胞多组学数据(如scRNA-seq、scATAC-seq和snmC-seq),并同时进行调控交互推断。

m0_58293236的博客 1152

GLM5.1实现UEFI打飞机游戏:提示工程驱动的固件级AI编程

UEFI开发是操作系统与硬件之间的关键接口,其裸金属约束(无标准库、无动态内存、仅BootServices)对AI代码生成提出严峻挑战。本文围绕大模型在UEFI环境下的实际落地能力展开,聚焦图形输出(GOP协议)、输入处理(KeyboardIo中断)、定时控制(SetTimer状态机)与内存安全(STATIC布局+字节对齐)四大核心原理,揭示LLM如何从API拼接进阶为协议时序建模。技术价值在于验证了提示工程可替代传统IDE辅助,在EDK II构建体系下直接产出可编译、可烧录、可交互的完整应用。典型应用场景

weixin_34133829的博客 478

SC-FDMA

<br />SC-FDMA(Single-carrier Frequency-Division Multiple Access,單載波分頻多工),是LTE的上行鏈路的主流多址。<br />SC-FDMA是單波載(Single-carrier),與OFDMA相比之下具有的較低的PAPR(峰值/平均功率比,peak-to-average power ratio),比多載波的PAPR低1-3dB左右(PAPR是由于多載波在频域叠加引起)。更低的PAPR可以使行動終端(mobile terminal)在發送功效方面

jod的专栏 3299

第 13 章:Spring AI Alibaba MCP 与 Nacos3 — 企业级MCP服务

理解Spring AI Alibaba 框架下的MCP服务与Nacos注册中心整合的必要性,学会Spring AI Alibaba-基于Nacos的MCP实现方法

paopao_wu的专栏 788

UEFI裸金属自检:手写21项硬件测试,从启动到一键报告的实现

在裸金属服务器与无头工作站运维中,最棘手的场景莫过于操作系统无法启动时的硬件排障。传统诊断工具依赖系统环境,而memtest等方案又仅覆盖单一硬件,导致工程师面对间歇性故障时常常盲人摸象。本文介绍一种基于UEFI固件环境的自研整机自检方案:利用EDK2开发框架,在操作系统加载前直接调用底层协议,完成CPU、内存、PCIe、存储等21项硬件测试。通过GOP图形协议实现全流程可视化界面,并支持一键导出结构化报告。该方案将排障起点提前至UEFI阶段,有效填补了商用工具昂贵、开源工具偏科、系统工具失效的真空地带。适

weixin_34126557的博客 261

YOLO26改进 - C2PSA | C2PSA融合CPIASA跨范式交互与对齐自注意力机制 : 交互对齐机制,提升小目标与遮挡目标判别力 | ACM MM2025

本文介绍了跨范式表征与对齐Transformer(CPRAformer)及其核心的跨范式交互与对齐自注意力机制(CPIA - SA),并阐述了其在YOLO26中的结合应用。传统图像去雨模型特征提取局限大,CPIA - SA通过协同“空间 - 通道”与“全局 - 局部”范式解决该问题,由SPC - SA、SPR - SA和AAFM子模块构成,经双路提取、动态过滤、空间细化、对齐融合四步工作。我们将相关代码引入指定目录,在`ultralytics/nn/tasks.py`中注册,配置`yolo26 - C2PS

魔改工程师的博客 665

static 的三种用法:C 语言里一个关键字的三张面孔

本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

大模型全栈工程师 · Thanks_ks 313

基于C#的工业机器人上位机控制程序开发(搭配松下PLC+MC协议)

基于C#的工业机器人上位机控制程序开发,核心是上位机与松下PLC的MC协议通信和机器人控制的安全逻辑,而不是单纯的界面编写。在工控现场,程序的稳定性和安全性永远是第一位的——比如解耦通信逻辑、处理跨线程问题、添加安全互锁、记录操作日志,这些都是保证产线稳定运行的关键。新手在学习时,建议先跟着步骤搭建好环境,跑通基础的PLC通信和机器人控制功能,再逐步尝试进阶优化。数据模型化、通信封装化、逻辑模块化、UI解耦化。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1239

【Autoware】2小时安装Autoware1.13(保姆级教程)

Autoware是一款“一体化”开源自动驾驶软件,能实现感知、决策、控制等功能,通过在Ubuntu中搭建Autoware开发环境和案例的运行,使大家对自动驾驶技术的实现有一个更清晰的认识。

DevFrank的博客 1万+

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 177

《RT-Thread入门与实战》第1章:RT-Thread概述与核心优势

2006年由熊谱翔发起2017年成立上海睿赛德电子科技公司2021年成为国内首个通过ISO 26262 ASIL-D认证的RTOS。

2301_79143213的博客 985

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 673

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 375

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 271

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 52

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 231

软件商店常见问题标准处理流程

从底层软件源来看,/etc/apt/sources.list配置错误、源地址失效、公网与内网离线源混用、ARM64与x86_64架构源串用,以及DNS解析异常、系统代理配置错误,都会导致商店无法获取应用数据;打开该应用,确认可正常运行;软件商店作为系统内置的图形化软件分发与安装入口(UKUI桌面配套组件,底层依赖APT软件源),承担着应用软件的浏览、搜索、下载、安装、升级与卸载等核心功能,是终端软件部署与管理的关键通道。覆盖软件商店启动、页面加载、应用下载、安装、卸载、搜索、自身更新等全部业务场景。

qq_39496637的博客 268

【AI 开发从入门到进阶 · 10】收官篇:LoRA 微调、模型评估、推理加速与生产部署全链路

本文系统梳理了大模型微调与生产落地的全流程,从决策是否微调、优选LoRA技术方案,到代码实现、效果评估、推理加速与FastAPI服务封装,最终构建可迭代的生产级AI系统。强调“逐级升级”原则,倡导以数据闭环驱动优化,避免技术冲动。全系列贯穿工程化思维,提供可复用模板与实战建议,助力开发者从模型训练迈向稳定可用的AI服务部署。

信息安全领域优质创作者|操作系统领域专家 19

LangGraph 的分离思想总结

LangGraph 的分离思想,本质上是对"高内聚、低耦合"这一经典工程原则在 LLM 应用领域的落地。它通过状态与逻辑分离、节点职责分离、控制流与执行分离、计算与持久化分离、编排与实现分离五个层面,把一个难以维护的"大黑盒"拆解成一组可组合、可测试、可观测的部件。理解这套分离思想,比记住 API 更重要——因为当你面对新的智能体场景时,真正指导你做出合理拆分的,正是这些分离原则。

张晨光老师的播客 373

[C++]:7.STL:list

好久不见,firdawn小课堂又和大家见面啦。今天我们要学习的内容是list容器,list也是一种常用的数据结构。下面是本章的思维导图,那么让我们开始学习吧!自定义的list,由三个结构构成。分别是链表的最小组成单位,也就是链表节点。以及迭代器类和list类其实要特别说明的是, List的迭代器,它不是单纯的指针,因为我们如果对指针直接进行解引用操作的话,我们得到的是这个节点,而不是节点里面存储的值并且我们对这个指针加加,得到的也不是下一个节点的地址,而是所在节点的下一个单位的地址。

2301_80817679的博客 183

Java基础:泛型、类型擦除与 PECS 原则

泛型允许类、接口和方法使用类型参数,把许多类型检查提前到编译期,减少显式类型转换,提高代码复用性。例如。

cjpabc的博客 318

RT-Thread 5.4.0 完整版架构剖析(下):IPC、时钟、内存、设备与组件

从 IPC 全量、时钟与定时器、内存管理,到设备框架、组件层、软件包机制、移植裁剪与速查表,补齐 RT-Thread 5.4.0 完整版的下半张地图。

197

CMake 多目录工程实战:静态库与动态库的完整构建示例

本文通过一个完整CMake项目示例,展示了如何构建静态库(math)与动态库(sort),并分别在test1、test2中链接使用。项目结构清晰,顶层CMakeLists.txt统一管理变量,各子目录独立配置编译规则。通过add_library生成库,link_directories和link_libraries实现链接,最终完成构建与验证。重点区分了静态库(打包进可执行文件)与动态库(运行时加载)的差异,适用于实际工程化开发与面试准备。

2303_77004089的博客 121

第2讲:提示注入攻击——原理与防御

提示注入是攻击者通过恶意指令绕过AI系统规则的安全威胁,分为直接注入(如覆盖指令、角色扮演越狱)和间接注入(藏于文档或搜索结果中)。防御需三重机制:检测(识别高危模式与多轮诱导)、加固(设置优先级、随机分隔符、锁定输出)、净化(清除控制字符、编码、截断超长输入)。结合上下文分析与多模态处理,可有效防范编码绕过、过度净化等陷阱。核心理念:防御需检测、加固、净化联动,筑牢AI应用安全防线。

sandaoliuge的博客 261
上一篇: QEMU启动OVMF shell超时分析
下一篇: Public TCC User Guide Q1 2026新增章节解析
Cerman
博客等级 码龄11年 63粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cerman

你的鼓励是探索和创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值