如何跟踪ACPI代码

没有整个框架去细看OS对ACPI处理是不好的 现在已经很久没有去更新ACPI表,整日忙于工作。工作上大体上是没有任何意义,学习不到底层上的原理只能抽空看看了。越工作越觉得自己知识深度可宽度都不行。我在前面acpi_early_init 中看到了,OS会开辟一段ACPI表的空间创建,创建表头,创建信号量等一系列上的操作。acpi_init对这些函数进行了进一步的处理。init_acpi_device_notify(); 初始化ACPI设备的通知系统。 acpi_bus_init():一个ACPI(高级配置和电源接口)总线初始化函数pci_mmcfg_la 阅读详情
 

ACPI是现代计算机系统中BIOS与操作系统间的桥梁。ACPI不仅定义了很多电源和休眠有关的标准,它还定义了如何通过FADT、XSDT、RSDT以及ASL语言来实现与操作系统的交互。

有些系统问题,比如无法进入睡眠状态,无法唤醒(自动重启,或死机)等,是与ACPI直接有关的。但如何定位出错的具体原因一直是一个比较困难的课题。很多时候不得不使用排除及试探等间接方法来解决,效率很低。本文介绍一种直接跟踪ASL源代码的直接方法。

1,   建立两台机器组成的内核调试环境(详见WinDbg帮助文档)。

2,   在调试机上按Ctrl+Break将被调试机中断到调试器。

3,   尝试使用!amli debugger命令启动AMLI调试器。第一次运行该命令可能失败。典型的出错信息如下:

AMLI_DBGERR: failed to get debugger flag address

此错误的根本原因是本地的AMLI调试模块没有找到合适的调试符号。原因有两个:

1)   被调试机没有使用调试版本的ACPI驱动(ACPI.DLL);

2)   WinDbg还没有加载ACPI调试符号文件。对于此种情况,可尝试使用.reload命令,通常就可以解决问题了。

重新运行!amli debugger,如果没有任何显示,那么本地的AMLI调试模块就合被调试机的ACPI解释器成功握手了(通信)。当ACPI解释器再得到执行时,它就会立刻break到调试机的调试器中。因此,需要执行g命令让被调试机跑起来,才可能真正中断到AMLI的脚本调试器。

本地的AMLI调试扩展模块名称如下:

Windows NT 4.0

Not available

Windows 2000

acpikd.dll

Windows XP and later

kdexts.dll

 

4,   可以运行一些AMLI命令来检查它是否工作正常。比如!amli dns可以打印出ACPI空间中的所有对象。

!amli dns

ACPI Name Space: / (ffffffff81b3c024)

Unknown(/___)

| Unknown(_GPE)

| | Method(_L03:Flags=0x0,CodeBuff=ffffffff81b3c841,Len=31)

| | Method(_L04:Flags=0x0,CodeBuff=ffffffff81b3c8c1,Len=31)

| | Method(_L05:Flags=0x0,CodeBuff=ffffffff81b3c941,Len=31)

| | Method(_L0B:Flags=0x0,CodeBuff=ffffffff81b3c9c1,Len=31)

| | Method(_L0C:Flags=0x0,CodeBuff=ffffffff81b3ca41,Len=31)

| | Method(_L0D:Flags=0x0,CodeBuff=ffffffff81b3cac1,Len=31)

| | Method(_L0E:Flags=0x0,CodeBuff=ffffffff81b3cb41,Len=31)

| | Method(_L1D:Flags=0x0,CodeBuff=ffffffff81b3cbc1,Len=32)

| Unknown(_PR_)

| | Processor(CPU0:Processor ID=0x1,PBlk=0x410,PBlkLen=6)

| | Processor(CPU1:Processor ID=0x2,PBlk=0x410,PBlkLen=6)

| Unknown(_SB_)

| | Device(SLPB)

| | | Integer(_HID:Value=0x000000000e0cd041[235720769])

| | | Method(_PRW:Flags=0x0,CodeBuff=ffffffff81b3cccd,Len=8)

| | Device(PCI0)

| | | Integer(_HID:Value=0x00000000030ad041[51040321])

| | | Integer(_ADR:Value=0x0000000000000000[0])

| | | Method(_INI:Flags=0x0,CodeBuff=ffffffff81b3d6dd,Len=16)

| | | Buffer(PBRS:Ptr=ffffffff81b3d71c,Len=136){

    0x88,0x0d,0x00,0x02,0x0c,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00

    0x00,0x01,0x47,0x01,0xf8,0x0c,0xf8,0x0c,0x01,0x08,0x88,0x0d,0x00,0x01

    0x0c,0x03,0x00,0x00,0x00,0x00,0xf7,0x0c,0x00,0x00,0xf8,0x0c,0x88,0x0d

……(省略很多行)

也可以通过命令行参数,显示ACPI空间树中从某个设备开始的子树。比如一下命令显示的是电池设备。

kd> !amli dns /s /_sb_.pci0.bat0

 

ACPI Name Space: /_SB_.PCI0.BAT0 (ffffffff81b290f4)

Device(BAT0)

| Integer(_HID:Value=0x000000000a0cd041[168611905])

| Method(_STA:Flags=0x0,CodeBuff=ffffffff81b291d1,Len=32)

| Method(_BIF:Flags=0x0,CodeBuff=ffffffff81b29255,Len=274)

| Method(_BST:Flags=0x0,CodeBuff=ffffffff81b293c9,Len=262)

| | Package(PBST:NumElements=4){

| | | Integer(:Value=0x0000000000000001[1])

| | | Integer(:Value=0x0000000000000a6e[2670])

| | | Integer(:Value=0x0000000000000000[0])

| | | Integer(:Value=0x0000000000002ee0[12000])

| | }

| Method(_PCL:Flags=0x0,CodeBuff=ffffffff81b29531,Len=5)

5,   发出g命令,让被调试机恢复运行状态。因为ACPI的代码的使用频率很高,所以被调试机的ACPI解释器通常很快就会得到执行,并中断进调试器。其状态如图1所示。可见,命令行提示符已经由原来的kd>变为Input> (AMLI(? For help))。在此状态下,只可以运行AMLI调试器的命令。而且不需要再使用!amli前缀。

图1,中断到AMLI调试器

 

6,   AMLI调试器也提高了一系列断点命令以实现跟踪功能。比如可以通过以下命令在电池设备的_STA方法入口处设置断点。

AMLI(? for help)-> bp /_sb.pci0.bat0._sta

bp /_sb.pci0.bat0._sta

成功设置的断点,AMLI调试器仅仅会回显该断点命令。如果设置失败,还会附加有错误信息,例如:

AMLI(? for help)-> bp /_sb.pci0.bat0.sta

bp /_sb.pci0.bat0.sta

AMLI_DBGERR: object not found or object is not a method - /_SB.PCI0.BAT0.STA

 

7,   设置断点后,可发出g命令让被调试机恢复运行。

8,   当断点被触发时,被调试机会被中断到调试器。

AMLI(? for help)-> g

g

 

Hit Breakpoint 0.

 

AMLI(? for help)->

可以通过ln命令判断本次断点最近的方法名:

AMLI(? for help)-> ln

ln

81b291d1: /_SB.PCI0.BAT0._STA

通过r命令可以显示出当前的上下文。包括线程、堆栈、ASL变量值等信息。

AMLI(? for help)-> r

r

 

Context=81adf000*, Queue=00000000, ResList=00000000

ThreadID=81b4c020, Flags=00000030

StackTop=81ae0f0c, UsedStackSize=244 bytes, FreeStackSize=7708 bytes

LocalHeap=81adf0bc, CurrentHeap=81adf0bc, UsedHeapSize=52 bytes

Object=/_SB.PCI0.BAT0._STA, Scope=/_SB.PCI0.BAT0._STA, ObjectOwner=81adf0e0, SyncLevel=0

AsyncCallBack=f99e6e98, CallBackData=e32de8b0, CallBackContext=f9e9a760

 

MethodObject=/_SB.PCI0.BAT0._STA

81ae0f5c: Local0=Unknown()

81ae0f70: Local1=Unknown()

81ae0f84: Local2=Unknown()

81ae0f98: Local3=Unknown()

81ae0fac: Local4=Unknown()

81ae0fc0: Local5=Unknown()

81ae0fd4: Local6=Unknown()

81ae0fe8: Local7=Unknown()

81adf040: RetObj=Unknown()

 

Next AML Pointer: 81b291d1 [/_SB.PCI0.BAT0._STA]

81b291d1: Store(^^SBUS.SRDW(0x16, 0xa), Local0)

81b291e2: If(LEqual(Local0, 0xffff))

81b291e9: {

81b291e9: | Return(0xf)

81b291ec: }

Press to continue and 'q' to quit?

 

81b291ec: Else

81b291ee: {

81b291ee: | Return(0x1f)

81b291f1: }

通过u命令可以将当前的AML代码反汇编成ASL。

9,   可以使用p或t命令跟踪ASL代码。

AMLI(? for help)-> p

p

Store(^^SBUS.SRDW(0x16,0xa)

81b4bc69: {

81b4bc69: If(LNot(LEqual(Acquire(MSMB,0xfffe)=0x0,Zero)=0xffffffff)=0x0)

AMLI(? for help)-> p

p

 

81b4bc7a: If(STRT()

81b4bf55: {

81b4bf55: Store(0x3e8,Local0)=0x3e8

AMLI(? for help)->

 

10,  执行set traceon 命令,可以使能ACPI解释器的踪迹功能,打印出所有ACPI代码的执行情况。

81b4bc90: Store(0xbf,HSTS)=0xbf

81b4bc97: Store(Or(Arg0=0x16,One,)=0x17,TXSA)=0x17

81b4bca0: Store(Arg1=0xa,HCOM)=0xa

81b4bca6: Store(0x4c,HCON)=0x4c

81b4bcad: If(COMP()

81b29035: {

81b29035: Store(0xfa0,Local0)=0xfa0

81b2903a: While(Local0=0xfa0)

81b2903d: {

81b2903d: Store(HSTS=0x42,Local1)=0x42

81b29043: If(And(Local1=0x42,0x1e,)=0x2)

81b2904a: {

81b2904a: If(And(Local1=0x42,0x2,)=0x2)

81b29051: {

81b29051: Return(One)

Tracking ACPI/ASL Using WinDbg Tracking ACPI/ASL Using WinDbg 1. Preface       ACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。   阅读详情

相关推荐

行人检测模型在海思平台上的部署:从 PyTorch 到 NNIE 深度优化与实践

摘要 本文详细介绍行人检测模型从PyTorch到海思NNIE平台的部署流程。首先分析了行人检测面临的挑战(尺度变化、遮挡、姿态多样性等)及边缘部署的优势(实时性、隐私保护等)。重点阐述了模型转换过程:PyTorch→ONNX→Caffe→NNIE-WK,其中PyTorch转ONNX需注意评估模式设置、虚拟输入匹配、操作集版本选择等关键点。文章旨在帮助开发者在海思3516D芯片上实现高效的行人检测,克服部署过程中的常见问题,最终实现边缘设备的实时目标检测能力。

FJN110的博客 216

如何使用WinDBG跟踪调试ASL/ACPI?

在现代计算机中,硬件和固件(BIOS)都必须符合ACPI规范,以便操作系统可以控制所有模块的自动配置和电源管理。 使用WinDbg调试ACPI代码通常需要两台计算机,一台是目标机(Debuggee),另一台作为主机(Debugger)。下面就介绍一下怎么在两台机器上建立调试环境。1、配置调试Debuggee的连接方式Windbg支持COM、1394、USB2.0三种不同的连接方式,看到网上

Sean的笔记本 1万+

LangGraph实战训练营-从零构建AI驱动的wiki知识库

本文深入解析 LangChain 团队开源的 Deep Agents 框架核心示例——LLM Wiki,一个基于大语言模型自动构建和维护持久化知识库的生产级 AI Agent 系统。文章从项目架构、环境搭建、核心原理到实战操作全面展开:详解 CompositeBackend 组合后端与细粒度权限控制的安全设计、四种工作模式(初始化/摄取/查询/质量检查)的完整流程、LangSmith 远程沙箱的隔离执行机制,以及人机协同审核(HITL)的实践应用。

program哲学 198

【教程】修复常见ACPI问题(DSDT等)

参考文章: http://forums.gentoo.org/viewtopic.php?t=122145 http://bbs.gter.net/bbs/viewthread.php?tid=1093610   说明:这篇文章写于2004年,作者主要是针对Linux内核进行一些DSDT相关修复,但文章内容对于理解DSDT非常有益,这里翻译DSDT相关的内容,供参考。内容上有一些删减和增添

月朗星稀 6万+

基于Simulink的伺服电机位置闭环控制仿真

本文带你从零构建了伺服电机位置闭环控制系统​ 的完整Simulink仿真模型,实现了:✅ 搭建PMSM伺服电机、逆变器、机械臂负载的主电路与编码器反馈模型;✅ 用MATLAB Function实现三环控制(位置环PID、坐标变换、电流环PI);✅ 验证阶跃定位(稳态误差0.002°、响应0.08s)与正弦跟踪(误差0.008°)的高性能;✅ 对比开环控制,明确位置闭环在精度、响应、抗扰上的优势;✅ 理解“三环嵌套+反馈校正”的核心思想(精密定位的工程实现)。核心收获。

amy_mhd的博客 173

using WINDBG debug ASL and DTM fail

WINDBG DEBUG ASL WinDBG 采用Host 和Target 方法进行debug,这是系统级debug 常用的方法,使用Host 机器debug Target 机器,所以一般要两台机器。。1. 首先把两台机器连起来,有3 种连接方法COM:常用的串口线就可以,但是现在NB 上基本没有串口,在Server 系统上现在串口还是比较常见,所以debug Server 的...

weixin_33778778的博客 229

leetcode134 加油站

题目如下 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明: 如果题目有解,该答案即为唯一答案。 输入数组均为非空数组,且长度相同。 输...

ayang818 's blog 234

VirtualBox Mac启动失败,错误:acpi table not found:dsdt.aml

转载请注明出处,原文网址:http://blog.youkuaiyun.com/m_changgong/article/details/7782076 作者:张燕广 首先,这个错误跟VirtualBox版本没有关系。 刚开始用的引导Mac的iso是:empireEFIv1085.iso,在公司的机子上引导Mac没有问题(虽然也出现acpi table not found:dsdt.aml,但是按任意键后就

长弓的专栏 1万+

pycharm一直选择不了conda正确路径弹框报错:latinit property envs_dirs has not been initialized...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2920

IEC61850规约客户端软件开发实战(第二章)

本文介绍了基于IEC61850规约的客户端软件开发过程,重点阐述功能界面设计和服务端连接功能的实现。界面采用Qt框架设计,包含功能按钮区、数据模型展示区(使用QTreeWidget)和状态显示区。连接功能通过libiec61850开源库实现,详细说明了连接流程、句柄创建及状态管理的代码实现。测试结果表明系统能正确识别连接状态,并通过界面直观显示。文章为IEC61850规约软件开发提供了实用参考,下期将分享规约模型数据加载的实现过程。

半青年的博客 2858

ACPI电源管理核心函数解析与应用实践

ACPI(高级配置与电源接口)是现代计算机系统中实现操作系统与硬件间电源管理的关键技术规范。其核心机制通过_PSC和_PRx等ACPI方法实现设备电源状态管理,涉及D0-D3多个电源状态转换、功耗特征检测以及唤醒能力配置。在Linux内核中,ACPISystemPowerQueryDeviceCapabilities和ACPISystemPowerUpdateDeviceCapabilities这两个关键函数分别负责设备电源能力查询与动态更新,它们通过解析ACPI命名空间对象并与AML代码交互,为系统提供精

weixin_30074763的博客 240

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LINUX内核PCI扫描过程

LINUX内核PCI扫描过程 内核版本 3.10.1031. ACPI热插拔扫描subsys_initcall(acpi_init)@drivers/acpi/bus.c|-acpi_scan_init@drivers/acpi/scan.c |->acpi_pci_root_init@drivers/acpi/pci_root.c | |->acpi_scan_ad...

weixin_30364147的博客 519

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ACPI.sys,从Windows到Bios的桥梁(1):跟踪win7开启ACPI

由于windows设备驱动程序被设计成以设备堆栈(Device stack)的形式,下层驱动向上提供支持,所以我们习惯于不加思考的在设备栈的上层使用来自下层驱动的各种已有功能。当我还在做驱动程序时,经常见到这些句话: A1."功能驱动(Fdo)收到IRP_MJ_PNP&IRP_MN_START后,会向总线驱动(Pdo)查询并正确配置所需的硬件资源,如IO Port/IRQ/Mem等,然后才开始工作"。这段话我一直感到困惑:功能驱动的硬件资源来自总线驱动,那么总线驱动的资源由谁提供?可能有人...

lixiangminghate的专栏 4761

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windbg跟踪ACPI亮度设定

有阵子没更新博客了,趁着有空更新一下前阵子在工作遇到的内容: 公司要出货一批笔记本,对屏幕亮度上限有限定。我无意中发现可以通过控制ACPI命名空间中Method(_BCL)的行为来实现该需求,虽然事后证明这种方式是错误的,但并不影响我记下windbg跟踪ACPI的方法。 先简单介绍一下Method(_BCL)的作用,翻开ACPI Spec会看到下列定义: 这是一个Bios提供给OS用于设置集显亮度百分比的接口(强调一下,仅设置集显,不包含外显)。对于Win10,Method(_BCL)在切换显示比列

lixiangminghate的专栏 1384

windbg调试ACPI ASL Code 实例一则

准备工作:搭建ACPI调试环境请移步至:《搭建Win7调试ACPI的环境》里面有Checked Build ACPI.sys 本文中OS为Win7 x86(镜像:en_windows_7_ultimate_x86_dvd_X15-65921.iso) kd> vertarget ;记得OS一定要和ACPI.sys匹配,否则替换ACPI后OS可能无法启动。 ;我的OS版本信息如下 Wi...

lixiangminghate的专栏 4550

从Windows到Bios的桥梁:Windbg跟踪Win7开启ACPI

点击上方蓝色“终端研发部”,选择“设为星标” 学最好的别人,做最好的我们 本文为看雪论坛优秀文章看雪论坛作者ID:hyjxiaobia由于windows设备驱动程序被设计成以设备堆栈(De...

这个时代,作为程序员可能要学习小程序 1079

Linux中ACPI的初始化

ACPI初始化机制分析 acpi_early_init()是Linux内核ACPI子系统的核心初始化函数,主要完成以下工作: 基础检查:确认ACPI未被禁用(acpi_disabled),检查是否启用宽松模式(acpi_strict) 子系统初始化: 调用acpi_initialize_subsystem()建立全局数据结构 加载系统描述表(acpi_load_tables()) 关键表处理:获取FADT表并复制到全局变量 硬件初始化: 在x86架构下处理SCI中断配置 最终启用ACPI硬件功能 错误处理:

weixin_51019352的博客 455

ACPI!PciConfigSpaceHandler到ACPI!PciConfigSpaceHandlerWorker到ACPI!GetPciAddress

ACPI!PciConfigSpaceHandler到ACPI!PciConfigSpaceHandlerWorker到ACPI!GetPciAddress

linux-0.11调试教程 460

Coresight - Devicetree/ACPI简介

ARM Coresight - devicetree相关简介

小立仔 2150

ACPI!ACPIBuildProcessRunMethodPhaseRunMethod函数分析到ACPI!ACPIBuildProcessRunMethodPhaseRecurse

ACPI!ACPIBuildProcessRunMethodPhaseRunMethod函数分析到ACPI!ACPIBuildProcessRunMethodPhaseRecurse

linux-0.11调试教程 344

linux acpi=off

kernel后加acpi=off 是什么意思? acpi=off是关闭高级电源管理接口 使用acpi = off会在启动Ubuntu时暂时禁用高级配置和电源接口。如果必须添加acpi = off使ubuntu成功启动,则表示计算机上的ACPI与该版本的ubuntu不兼容。 但是,如果您不想在acpi = off每次引导时都添加参数,则可以禁用新卡(BIOS)或禁用ACPI(也可以通过BIOS)。如果找不到新卡界面,请使用第二个选项。 并不是所有的参数都是永远可用的,只有在特定的模块存在并且相应的硬件也存

sinat_42884063的博客 6491
上一篇: 使用WinDbg调试程序
下一篇: KeBugCheck2的第6个参数
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值