第七篇:风起于青萍之末-电源管理请求案例分析(下)

2023-05-16

第五篇:风起于青萍之末-电源管理请求案例分析(上)
http://blog.csdn.net/u013140088/article/details/18180249
第六篇:风起于青萍之末-电源管理请求案例分析(中)
http://blog.csdn.net/u013140088/article/details/18218593
在前面两篇技术BLOG中,我给出了部分分析过程, 其中有些部分对于后续分析是有作用的,也有一些分析,属于走了一些弯路,但并非完全是无用功.
上篇中, 分析判断得出这一系列近20个BSOD都是系统发往第四级SS HUB的电源管理IRP(SET D3), 在规定的时间范围内, 该IRP没有被完成,所以产生了该BSOD DUMP FILE.
中篇里, 从IRP栈, 栈回溯, 相关线程与事件, 系统死锁, 以及 前一个电源IRP(SET S4)的分析, 期望找到一些线索来得出最后结论, 但由于"Windbg"使用技巧与Windows 操作系统功底有限, 最终没有找到问题的根本原因.
问题的解决与发现,并非"自古华山一条路"!
就以本案例来讲, 如果在功底有限的情况下, 与其非要从原来的道路走到黑,不如停下来, 稍作休息与思考, 寻找其它的解决方法.
请大家看一下, 第五篇中的"SuperSpeed Interop Tree with Host Under Test"
我们可以发现, SS HUB4下面所带有的SS USB DEVICE/HUB.
SS HUB4:
-->Port 1: -->SS HUB5-----------------> Port 1: SS Lower Power Drive & (Port 2: SS video camera, 实际测试中, 由于市面上没有SS, 所以是HS, 忽略)
-->Port 2:
-->Port 3: -->SS Display adapter
-->Port 4:
发现, SS HUB4下面, 一共有两个SS DEVICE, 一个SS HUB.
说到这里, 简单提一下, 系统的睡眠过程是由外向内的过程, 在这里就表现为, 先SS HUB5下面的SS Lower Power Driver, 然后再SS HUB5.
要想让SS HUB4进入睡眠, 它的先决条件是SS HUB5与SS Display adapter都已经进入睡眠状态.
我们大胆地作一个猜测, 发给SS HUB4物理设备对象的IRP(SET D3)超时, 就是因为SS HUB4没有成功进入睡眠状态, 而纠其进一步的原因, 必定是:
要么SS Display adapter没有进入睡眠, 要么就是SS HUB5没有进入睡眠.
走到这一步, 我们又可以分别通过:
1. 分析BSOD DUMP FILE中, SS Display adapter与SS HUB5的行踪
2. 架起USB analyzer, 实实在在地"捕获" "东窗事发"时USB总线上的内容.
如果没有USB analyzer, 只能通过方法1继续在黑暗中, 打着"Windbg"这个手电, 慢慢摸索.
幸运的是, 我们作为USB xHCI HOST/Device IP的开发与验证工程师, USB analyzer与PCIe analyzer这样贵重的设备仪器却是必不可少的.
相对来讲, Lecroy的USB analyzer比较好用且容易上手, PCIe的只用过Lecroy, 不作评价.
既然有更加简单的方法, 就立马使用.
不过,这里还存在一个问题:
如果只有一台USB analyzer, 我们应该将它放在那个位置?
因为目前, 我们并不清楚, SS HUB4下面没有成功进入睡眠的是其中的哪一路, 还是两路都没有成功进入睡眠.
那么, 放在SS HUB4的down stream port (port 1 or port 3)中的任何一路, 都是不合适的,  因为这样存在一定的时间成本.
所以, 将USB analyzer放在SS HUB4 Up stream port.
在这种情况下, SS HUB4通过接收xHCI host发过来的USB control request来控制其下属的两个PORT.
set feature 来设置这个PORT是进入睡眠U3,还是正常工作U0.
Get status来取得这个PORT的状态.
问题发生的时候, 一次又一次, 频率非常高.
但当我们真要通过Lecroy USB ANALYZER去"捕获"它的时候, 问题的复现又变得特别不容易.
但是没有别的办法,只能慢慢地等待, 至少比起没有USB analyzer的情况, 条件是好多了.
最后, 被我的同事抓到了"现形".
经过分析, 我们发现, PORT 1上的SS HUB5已经成功进入睡眠状态U3.
而PORT3上的 SS DISPLAY ADAPTER起初, 也已经进入睡眠状态U3, 但随之而来的, 是系统又将它唤醒到U0状态.
至此, 我们找到了SS HUB4电源管理IRP无法完成的原因.
将xHCI host硬件IP排除出了该问题怀疑对象的范围.
后记:
1. 如果没有Windbg的前期定位, 要将USB analyzer正确放置在哪一级, 要发现问题的原因都无从谈起.
2. 曾经和一个开发上层应用软件的工程师无意间谈论起PCIe与USB, 由于现在行业细分起来起明显, 同样是搞IT这一行的, 但细分之后, 仍然可以用"隔行如隔山"来形容.
有意思的是, 这个工程师的固有观念就是:
PCI/PCIe比USB复杂;
CPU比PCIe复杂;
搞底层接口的工程师, 主要的工作就是画板子, 只要把几根导线接对了就可以了.
事实上, 
了解过一点PCIe与USB3.0协议的工程师,都知道, 这两者的差异非常非常小.
而从设计CPU与PCIe/USB3.0的IP的角度(不是应用角度), 也没有他脑海中, 这种一个天,一个地的差距.
而底层接口工程师, 所需要具备的素质, 我已经在:
第一篇:践履实录2006-2013
http://blog.csdn.net/u013140088/article/details/17325589
提到过:
各种协议, 操作系统(Linux/Windows), x86/ARM CPU, 软件调试等一系列内容.
3. 仍然一些遗留问题, 不得而知:
比如说:
通过!poaction的输出:
***************************************************************
Allocated power irps (PopIrpList - 825fb560)
  IRP: 8a90af48 (wait-wake/S3), PDO: 891050f0
  IRP: 91da2f00 (wait-wake/S4), PDO: 890dba50
  IRP: 80e7cc98 (wait-wake/S4), PDO: 86a54500
  IRP: 80eb4d50 (wait-wake/S4), PDO: a805c650
  IRP: 80fb8c30 (wait-wake/S4), PDO: a806a030
  IRP: 80f9cce0 (wait-wake/S4), PDO: 86a1e4d0
  IRP: 80eded70 (wait-wake/S4), PDO: 86a22620
  IRP: 81b8a9f0 (wait-wake/S4), PDO: b6cda080
  IRP: be9da9f0 (wait-wake/S4), PDO: b5186ce0
  IRP: 80350aa0 (wait-wake/S4), PDO: b6df2878
  IRP: b597c8a8 (wait-wake/S4), PDO: b5119ce0
  IRP: be8b4960 (wait-wake/S4), PDO: b511a030
  IRP: aed5a9f0 (wait-wake/S4), PDO: bae779e0
  IRP: 814c8aa0 (wait-wake/S4), PDO: b6df2bd8
  IRP: 80396b78 (wait-wake/S4), PDO: baf13490
  IRP: ab7b4aa0 (set/S4), PDO: 85be34c0, CURRENT: baf54bf8, NOTIFY: 86a3e038
  IRP:  bcd5eaa0  (set/D3,), PDO:  85be34c0 , CURRENT: baf54bf8
  IRP: bb7fcb78 (wait-wake/S4), PDO: baf42ac8
  IRP: aa70cde0 (wait-wake/S4), PDO: 85b81030
  IRP: 815eaeb8 (wait-wake/S3), PDO: 890de030
  IRP: 80ef0c50 (wait-wake/S4), PDO: 943aa148
  IRP: bb754e48 (wait-wake/S4), PDO: 8e0d7028
  IRP: ba774de0 (wait-wake/S4), PDO: 943b3650
  IRP: b58e4eb8 (wait-wake/S3), PDO: 890dc030
  IRP: bb7b6e48 (wait-wake/S4), PDO: 8e0ca028
  IRP: 97512d28 (wait-wake/S4), PDO: 86a37178
***************************************************************
除了 set/S4与set/D3, 其它的都是wait-wake/S4, 那么我们可以认为, 与这些wait-wake/S4对应的PDO已经进入了睡眠状态.
但是, 我根据系统设备树与这些IRP的一一配对, 才发现:
 IRP: 81b8a9f0 (wait-wake/S4), PDO: b6cda080          USB\VID_17E9&PID_C300\DDR3Test           usbccgp
这个就是SS HUB4 PORT3下面的SS DISPLAY ADATPER设备, 操作系统认为他已经进入睡眠了.
而事实上, 它是经过了睡眠,又被唤醒了.
我们不知道是什么原因被唤醒, 有一种可能, 是SS DISPLAY ADAPTER的驱动程序, 做了什么事情.
更进一步的猜测是, SS DISPLAY ADAPTER的驱动程序没有做好电源管理这一块代码, 导致了
1. 设备按要求进入D3, 又被唤醒
2. 驱动中该设备的状态,与系统记录的状态不符合.
**************************************************************************************************************************

IRP: 8a90af48(wait-wake/S3), PDO: 891050f0              ACPI\PNP0C0C\aa

  IRP: 91da2f00 (wait-wake/S4), PDO: 890dba50          PCI\VEN_8086&DEV_1503&SUBSYS_20308086&REV_04\3&11583659&0&C8

  IRP: 80e7cc98 (wait-wake/S4), PDO: 86a54500         HID\VID_046D&PID_C05A\7&285a05ca&0&0000     mouhid

  IRP: 80eb4d50 (wait-wake/S4), PDO: a805c650        USB\VID_046D&PID_C05A\6&5197d5b&0&7               HidUsb

  IRP: 80fb8c30 (wait-wake/S4), PDO: a806a030          HID\VID_046D&PID_C31C&MI_00\8&72a4da2&0&0000            kbdhid

  IRP: 80f9cce0 (wait-wake/S4), PDO: 86a1e4d0          USB\VID_046D&PID_C31C&MI_00\7&2670f20a&0&0000          HidUsb

  IRP: 80eded70 (wait-wake/S4), PDO: 86a22620        USB\VID_046D&PID_C31C\6&173dd442&0&6            usbccgp

  IRP: 81b8a9f0 (wait-wake/S4), PDO: b6cda080          USB\VID_17E9&PID_C300\DDR3Test           usbccgp

  IRP: be9da9f0 (wait-wake/S4), PDO: b5186ce0          HID\VID_046D&PID_C05A\a&2da4de9c&0&0000     mouhid

  IRP: 80350aa0 (wait-wake/S4), PDO: b6df2878          USB\VID_046D&PID_C05A\9&256f82f9&0&4               HidUsb

  IRP: b597c8a8 (wait-wake/S4), PDO: b5119ce0         HID\VID_05A4&PID_9862&MI_00\c&100e23b3&0&0000""kbdhid"

  IRP: be8b4960 (wait-wake/S4), PDO: b511a030        USB\VID_05A4&PID_9862&MI_00\b&1fd64059&0&0000""HidUsb"

  IRP: aed5a9f0 (wait-wake/S4), PDO: bae779e0          USB\VID_05A4&PID_9862\a&3a3c313d&0&3""usbccgp"

  IRP: 814c8aa0 (wait-wake/S4), PDO: b6df2bd8          "USB\VID_05A4&PID_9837\9&3829339e&0&3""USBHUB3"

  IRP: 80396b78 (wait-wake/S4), PDO: baf13490         "USB\VID_0424&PID_2514\8&390024e6&0&2""USBHUB3"

  IRP: ab7b4aa0 (set/S4), PDO: 85be34c0,CURRENT: baf54bf8, NOTIFY: 86a3e038

                                                                                                                       "USB\VID_2109&PID_8110\9&1a101867&0&1""USBHUB3"

  IRP: bcd5eaa0 (set/D3,), PDO: 85be34c0,CURRENT: baf54bf8

  IRP: bb7fcb78 (wait-wake/S4), PDO: baf42ac8            USB\VID_0424&PID_2514\8&390024e6&0&3""USBHUB3"

  IRP: aa70cde0 (wait-wake/S4), PDO: 85b81030         USB\VID_8087&PID_0024\5&1c755ea1&0&1""usbhub"

  IRP: 815eaeb8 (wait-wake/S3), PDO: 890de0                PCI\VEN_8086&DEV_1E26&SUBSYS_20308086&REV_04\3&11583659&0&E8""usbehci

  IRP: 80ef0c50 (wait-wake/S4), PDO: 943aa148          USB\VID_050D&PID_0233\7&29fe3c0&0&2""USBHUB3"

  IRP: bb754e48 (wait-wake/S4), PDO: 8e0d7028       USB\ROOT_HUB20\4&2be67a78&0""usbhub"

  IRP: ba774de0 (wait-wake/S4), PDO: 943b3650        USB\VID_8087&PID_0024\5&213ddfc&0&1""usbhub"

  IRP: b58e4eb8 (wait-wake/S3), PDO: 890dc030        PCI\VEN_8086&DEV_1E2D&SUBSYS_20308086&REV_04\3&11583659&0&D0""usbehci"

  IRP: bb7b6e48 (wait-wake/S4), PDO: 8e0ca028        USB\ROOT_HUB20\4&1c3caa2d&0""usbhub"

  IRP: 97512d28 (wait-wake/S4), PDO: 86a37178        "USB\VID_2109&PID_2811\6&19bbf76c&0&2""USBHUB3"

**************************************************************************************************************************
希望能有操作系统与WINDBG的大牛给出这些遗留问题的解决方法.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第七篇:风起于青萍之末-电源管理请求案例分析(下) 的相关文章

随机推荐

  • ROS中tf树,frame未连接的问题。

    今天调节双舵轮的AGV xff0c 一开始无法导航 xff0c 由于学生有些忙 xff0c 没做urdf 我就直接发布静态坐标变换 xff0c odom到basefootprint是里程计自己编写 xff0c 问题是加了laser base
  • The POM for xxxx is missing, no dependency information available

    很久以前用Maven的时候基本都是一个工程 xff0c 后来感觉太落伍了 xff0c 就根据geoserver源码开始分模块对功能进行优化 后来有个新来的同事也碰到了这个问题 xff0c 我就给他解决一下 xff0c 顺便把以前的心得记录一
  • 无人机开发-介绍Mavlink协议的消息组成、如何看懂繁杂的mavlink官网介绍、简单介绍地面站与飞控的通讯流程

    这篇博客主要介绍了mavlink的消息组成和如何看懂繁杂的mavlink官网介绍以及简单介绍了下地面站与飞控的通讯流程 前面已经提到了在mavlink消息帧里最重要的两个东西 xff0c 一个是msgid xff1b 一个是payload
  • 无人机开发-介绍MAVLink代码的大概结构

    可以看到 xff0c 里面有多个文件夹和几个头文件 pixhawk xff0c ardupilotmega xff08 apm xff09 xff0c matrixpilot这类的文件夹里都是各个飞控自己定义的mavlink消息类型 xff
  • 无人机开发-图传技术浅析

    2016年 xff0c 是中国无人机市场的元年 xff0c 无人机能够一跃进入大众视野 xff0c 并迅速在大众市场火热发展 xff0c 是很多人始料未及的 从刚开始的空中摄录 xff0c 到后来的实时摄录 xff0c 方便的无人机图传功能
  • Ubuntu18.04安装ROS+gazebo9+PIX4仿真

    本文仅作安装过程记录之用 1 安装ros Ubuntu18 04选择ROS Melodic 教程网址 xff1a http wiki ros org cn melodic Installation Ubuntu 1 1配置 Ubuntu 软
  • PX4+gazebo仿真给无人机添加摄像头

    1 启动仿真 xff1a cd到Firmware文件夹 xff0c 执行以下代码 roslaunch px4 mavros posix sitl launch 如果启动过程卡住或者很慢 xff0c 下载该链接的压缩包https bitbuc
  • 最全Pycharm教程(10)——Pycharm调试器总篇

    如果觉得这篇文章对您有所启发 xff0c 欢迎关注我的公众号 xff0c 我会尽可能积极和大家交流 xff0c 谢谢 最全Pycharm教程 xff08 1 xff09 定制外观 最全Pycharm教程 xff08 2 xff09 代码风格
  • 关于嵌入式

    学习方向 首先要学习下基础课程单片机 xff0c 汇编和C语言等等 xff0c 然后再学习嵌入式 xff0c 如果说你要想水平高的话 xff0c 最好学习下操作系统 xff0c 数据结构 xff0c 算法及一些硬件方面的知识等等 看你是想在
  • make_unique的使用

    关于make unique的构造及使用例程 xff0c MSDN的讲解非常详细 xff08 https msdn microsoft com zh cn library dn439780 aspx xff09 使用过程中 xff0c 我的理
  • C#学习记录——C#编写串口程序

    因为电气自动化专业出差太多 xff0c 考虑学点其他的看能不能实现转行 xff0c 也没太清晰的路线 xff0c 看网上好多推荐电气自动化转C 上位机开发的 xff0c 也抽时间学习了解下C xff0c 因为非软件专业 xff0c 对计算机
  • the working directory ‘XXX’ does not exist

    积累点滴 今天在idea上重新建了一个项目 xff0c 结果一运行就报了 the working directory XXX does not exist 的错误 明明上一个项目都运行好好的 xff0c 怎么新建一个就出问题了呢 xff1f
  • Git 子模块(Submodule)

    提示 xff1a Git 子模块 Submodule 操作 文章目录 一 Git 子模块 Submodule 是什么 xff1f 二 使用步骤1 创建子仓库2 clone 带有子仓库的git项目 三 子仓库代码的修改和更新 一 Git 子模
  • Java Web项目开发项目经验总结

    一 学会如何读一个JavaWeb项目源代码 步骤 xff1a 表结构 gt web xml gt mvc gt db gt spring ioc gt log gt 代码 1 先了解项目数据库的表结构 xff0c 这个方面是最容易忘记的 x
  • React + TS + Mobx 示例

    一 创建项目 方式一 xff1a create react app todo React ts demo scripts version 61 react scripts ts cd todo React ts demo npm start
  • AMD IOMMU与Linux (2) -- IVRS及AMD IOMMU硬件初始化

    介绍AMD IOMMU driver基于IVRS的硬件初始化情况 1 I O Virtualization ACPI table 2 drivers iommu amd init c 1 I O Virtualization ACPI ta
  • AMD IOMMU与Linux (3) -- DMA

    Linux中DMA会使用硬件IOMMU如AMD IOMMU INTEL VT D xff0c 也会使用软件的SWIOTLB 这篇梳理一下LINUX内核在有AMD IOMMU的情况下 xff0c 是如何做DMA的 xff0c 内容包括如下 1
  • AMD IOMMU与Linux (4) -- Domain, Group, Device

    1 domain的本质是一个页表 xff0c 1对1的关系 2 IOMMU DOMAIN UNMANAGED vs IOMMU DOMAIN DMA a IOMMU DOMAIN UNMANAGED DMA mappings managed
  • 第三篇:知其然,知其所以然-USB音频设备的开发过程

    最近 xff0c 有朋友正好在开发一个USB音频设备 xff0c 所以询问我一些USB音频设备开发方面的技术细节问题 xff1b 也和音响发烧友聊到USB音频设备的实现方式与其优缺点 xff1b 后来 xff0c 也和人谈到实现一个USB音
  • 第七篇:风起于青萍之末-电源管理请求案例分析(下)

    第五篇 风起于青萍之末 电源管理请求案例分析 上 http blog csdn net u013140088 article details 18180249 第六篇 风起于青萍之末 电源管理请求案例分析 中 http blog csdn