6月前
评论
linux-dead-lock-detect-lockdep
**死锁概念**:死锁是指多个进程(线程)因等待已被其他进程占有的资源而陷入阻塞的状态。死锁一旦发生,程序本身无法解决,只能依靠外部力量使程序恢复运行。Linux 提供了检测死锁的机制,主要分为 D 状态死锁和 R 状态死锁。 **死锁类型**: * **D 状态死锁**:进程等待 I/O 资源无法得到满足,长时间处于 TASK_UNINTERRUPTIBLE 睡眠状态。触发成因复杂多样,可能因为 synchronized_irq、mutex lock、内存不足等。 * **R 状态死锁**:进程长时间处于 TASK_RUNNING 状态垄断 CPU 而不发生切换,导致多 CPU 间互锁,整个系统无法正常调度。 **常见错误**: * AA: 重复上锁 * ABBA: 曾经使用 AB 顺序上锁,又使用 BA 上锁 * ABBCCA: 这种类型是 ABBA 的扩展。AB 顺序 , AB 顺序,CA 顺序。 * 多次 unlock **AB-BA 死锁的形成**:假设有两处代码都要获取两个锁(lockA 和 lockB),如果进程 P 持有 lockA 后再去获取 lockB,而此时恰好由进程 Q 持有 lockB 且它也正在尝试获取 lockA,那么此时就是处于死锁的状态。 **lockdep 死锁检测模块**:lockdep 是 Linux 内核中的一种死锁检测机制,通过跟踪锁类的使用历史状态和依赖关系,以确保锁类状态和锁类之间的依赖总是正确的。lockdep 会检测并报告死锁风险,并提供相应的出错处理机制。 **检查规则**: * 单锁状态规则:一个软中断不安全的锁类也是硬中断不安全的锁类。 * 多锁依赖规则:同一个锁类不能被获取两次,不能以不同的顺序获取两个锁类,同一个锁实例在任何两个锁类之间,嵌套获取锁的状态前后需要保持一致。 **使用实例**:Lockdep 检测到死锁风险时,会打印相应的风险提示,并建议开发者修复代码,避免死锁。
6月前
评论
[Android稳定性] 第044篇 [问题篇] Unable to handle kernel write to read-only memory at virtual address
在老化测试中,多台机器出现黑屏问题,主要现象为使用9-11版本时,27台机器中有25台因USB问题导致dump,且问题多出现在使用33瓦充电器时。通过LOG分析,问题出现在45次重启测试中。dmesg日志显示,问题源于内存异常踩踏,具体为操作了空指针地址的结构体成员。 根本原因分析表明,在dwc3_msm模块中,存在一个空指针赋值操作,导致数据写入异常地址。解决方案建议对涉及空指针的代码进行兼容性处理,并在gerrit上提交了相关代码修改。
6月前
评论
[Android稳定性] 第042篇 [问题篇] 数组越界导致的Unexpected kernel BRK exception at EL1
在reboot压力测试中出现一台设备死机,分析发现是由于函数 `fg_mac_read_block` 在处理数据时,没有对数组长度进行范围限制,导致数组越界,触发 `Unexpected kernel BRK exception at EL1` 异常,最终导致设备死机。通过分析汇编代码和寄存器状态,确定问题根源并提出了修复方案,即在读取数据后增加对长度的判断,防止数组越界。同时,引申出对 `trace32` 解析结果和编译器优化行为的思考,强调了在实际调试中应结合寄存器状态进行分析,并注意编译器可能进行的优化。
6月前
评论
[音乐分享] 没有人是一座孤岛
本文主要表达了一个积极向上的观点:只要保持热情,坚持不懈,即使前路不一定一帆风顺,但仍然充满了无限的可能性。这是一种鼓励人们面对困难和挑战,持续奋斗的正能量态度。
6月前
评论
「要经历多少,才能明白这些话的意义?」
本文阐述了经历孤独、迷茫、坚持与顿悟的过程对心灵的磨砺。作者强调,每一次跌倒、每一段坚持、每一个笑着咽下委屈的夜晚,都是成长的必经之路。视频内容未知,但与文章主旨相呼应。
6月前
评论
「山上山下,皆是修行」
修行是每个人在世间的生活态度,无关身份。山上需修不傲慢、不忘本,山下则修不气馁、不自弃。生活百态皆修行场,强调修行在人心,而非仅在寺庙。
6月前
评论
[Android稳定性] 第041篇 [问题篇] Unable to handle kernel paging request at virtual address 00046ffca9037bf9
您好,根据您提供的信息,我总结了以下内容: **问题现象**:设备在系统休眠过程中出现死机。 **分析步骤**: 1. **初步定位模块**:问题出现在系统休眠过程中,设备陆续suspend,出问题的dev为disp_feature/disp-DSI-0。suspend流程中,disp-DSI-0的class被注销。 2. **第一个问题点**:display的初始化流程被电源键的中断触发函数触发,而没有走正常的display流程。 3. **第二个问题点**:`mi_disp_core_deinit`函数中,`class_destroy(g_disp_core->class)`导致class被销毁,但`g_disp_feature`仍然指向class,导致内存访问异常。 4. **第三个问题点**:`mi_disp_feature_init`函数中,kfree(df)后没有将df和g_disp_feature置为NULL,可能导致内存访问异常。 **问题总结**: * 死机原因是class的状态被销毁后没有同步给g_disp_feature。 * 需要将g_disp_core和g_disp_feature都置为NULL,并修复display初始化流程。 **建议**: * 修复display初始化流程,确保走正常流程。 * 在`mi_disp_core_deinit`函数中,将g_disp_core和g_disp_feature都置为NULL。 * 检查其他地方是否有类似的内存访问问题。 希望以上信息对您有所帮助!
7月前
评论
MTK平台模块加载顺序控制
本文主要探讨了Android设备中模块加载顺序控制的相关知识点。首先,介绍了模块在文件系统中的位置要求,包括不同启动模式下模块的存放位置和加载顺序。接着,阐述了Android构建系统如何通过定义变量来支持模块加载,并举例说明了供应商内核模块的配置方式。然后,针对MTK平台,详细分析了模块加载控制机制,包括`ko_order_table.csv`文件的作用、编译逻辑以及树外驱动编译控制。最后,总结了设置模块加载顺序的原则,即通过调整`ko_order_table.csv`中的顺序来控制模块加载顺序,遵循先加载ramdisk模块,后加载vendor模块,且同一类型模块中,顺序靠前的先加载。