1.概述
稳定性对项目交付、用户体验有着非常重要的影响,一般定义的稳定性问题是遇到了系统异常重启或者系统卡死等,即无法按照预期为客户继续提供功能和服务。地平线 SoC 平台提供了多种调试手段,去分析系统遇到的稳定性问题。
首先我们需要了解征程系列的软硬件方案及异常 reset 路径,通过了解异常路径定位发生异常的节点和步骤,定位到问题方向。
其次,我们需要对发生问题节点提取的调试信息,包括抓取 log、抓取 ramdump 等,对于复杂问题,可能需要不断的迭代 patch 以获取更多调试信息,以缩小问题的范围。
对于复杂问题,可能需要使用特定的工具去分析问题,如 crash-utility,T32,ftrace 等。
所以我们将稳定性问题的概述指导分为下面几个章节进行介绍。
2. 常见问题
2.1.kernel panic
- kernel panic 是最常见的系统异常,在 reset_reason.txt 中显示为 kpanic;
- 一般通过 pstore log 就能看到 panic 时的栈和寄存器信息,通过分析上下文配合符号表及 gdb 等工具经常能够直接定位问题;
- 对于复杂问题,需要开启 ramdump,抓取 dump 后进行分析。
一个典型的 kpanic 如下:
markdown
<4>[86758.651597] NMI backtrace for cpu 2
<4>[86758.651598] CPU: 2 PID: 105 Comm: khungtaskd Tainted: P O 6.1.134-rt51-04836-g0b3e5cbe5431 #13
<4>[86758.651601] Hardware name: Horizon AI Technologies, Inc. HOBOT Sigi-P Matrix (DT)
<4>[86758.651602] Call trace:
<4>[86758.651817] NMI backtrace for cpu 4
<4>[86758.651821] CPU: 4 PID: 5110 Comm: glmark2-es2-drm Tainted: P O 6.1.134-rt51-04836-g0b3e5cbe5431 #13
<4>[86758.651825] Hardware name: Horizon AI Technologies, Inc. HOBOT Sigi-P Matrix (DT)
<4>[86758.651826] pstate: 20400009 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
<4>[86758.651829] pc : mas_empty_area_rev+0x2f4/0x574
<4>[86758.651835] lr : mas_empty_area_rev+0x24c/0x574
<4>[86758.651838] sp : ffff800045eafab0
<4>[86758.651839] pmr_save: 000000e0
<4>[86758.651840] x29: ffff800045eafab0 x28: 00000000001fffff x27: 00000000002a0000
<4>[86758.651843] x26: 0000ffdf00000000 x25: 0000000000000018 x24: ffff00040c9d3000
<4>[86758.651846] x23: 0000000000200000 x22: ffff800008d30a28 x21: ffff00041a0cde0c
<4>[86758.651848] x20: 00000000002a0000 x19: ffff800045eafb48 x18: ffffffffffffffc2
<4>[86758.651850] x17: 0000ffdeff1fffff x16: 0000ffdf00000000 x15: 0000ffdeffffffff
<4>[86758.651852] x14: 0000000000200000 x13: 0000ffdeffffffff x12: ffff00041a0cde00
<4>[86758.651854] x11: ffff00041a0cde80 x10: 000000000029ffff x9 : ffffffffffffc005
<4>[86758.651856] x8 : 1fffe00083419bc1 x7 : 0000000000000000 x6 : 0000000000000000
<4>[86758.651858] x5 : 00000000003d0000 x4 : 0000ffdefee30000 x3 : ffff00041a0cde08
<4>[86758.651861] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff00041a0cde0c
<4>[86758.651863] Call trace:
<4>[86758.651864] mas_empty_area_rev+0x2f4/0x574
<4>[86758.651867] kbase_unmapped_area_topdown.constprop.0+0x150/0x27c [mali_kbase]
<4>[86758.651889] kbase_context_get_unmapped_area+0x2b0/0x3b0 [mali_kbase]
<4>[86758.651904] kbase_get_unmapped_area+0x4c/0x7c [mali_kbase]
<4>[86758.651920] get_unmapped_area+0x60/0xf0
<4>[86758.651925] do_mmap+0xe4/0x4fc
<4>[86758.651926] vm_mmap_pgoff+0xf8/0x190
<4>[86758.651929] ksys_mmap_pgoff+0xb8/0x10c
<4>[86758.651933] __arm64_sys_mmap+0x38/0x50
<4>[86758.651934] invoke_syscall+0x50/0x120
<4>[86758.651938] el0_svc_common.constprop.0+0x58/0x190
<4>[86758.651941] do_el0_svc+0x34/0xd0
<4>[86758.651944] el0_svc+0x28/0xb0
<4>[86758.651946] el0t_64_sync_handler+0xf4/0x120
<4>[86758.651949] el0t_64_sync+0x19c/0x1a0
<0>[86758.652637] Kernel panic - not syncing: hung_task: blocked tasks
<4>[86758.652639] CPU: 2 PID: 105 Comm: khungtaskd Tainted: P O 6.1.134-rt51-04836-g0b3e5cbe5431 #13
<4>[86758.652641] Hardware name: Horizon AI Technologies, Inc. HOBOT Sigi-P Matrix (DT)
<4>[86758.652641] Call trace:
<4>[86758.652642] dump_backtrace+0xe4/0x140
<4>[86758.652644] show_stack+0x20/0x30
<4>[86758.652645] dump_stack_lvl+0x64/0x80
<4>[86758.652647] dump_stack+0x18/0x34
<4>[86758.652649] panic+0x198/0x394
<4>[86758.652653] watchdog+0x2d0/0x510
<4>[86758.652655] kthread+0x138/0x140
<4>[86758.652657] ret_from_fork+0x10/0x20
<2>[86758.760353] SMP: stopping secondary CPUs
<0>[86758.760362] Kernel Offset: disabled
<0>[86758.760362] CPU features: 0x00000,000700a4,675072ab
<0>[86758.760364] Memory Limit: none
另外,一些其他的原因也会导致 kernel panic,详细会在 Kernel panic 进行介绍。
2.2. Memory corruption
Memory corruption 类问题一般表现也是 kpanic,但是最明显的标志是问题的随机性和不可解释性,出现这类情况,一般要考虑是内存使用上出现了 UAF(Use-After-Free),OOB(Out-of-Bounds)。
这类问题的难点在于,系统出现异常 crash 时,已经是前面时间发生踩踏的结果,所以需要定位到踩踏发生的位置,才能正向解决这类问题,一般在系统中存在下述两类踩踏问题:
a> Linux 内核发生踩踏:
- 对于 Acore 中运行的 Linux 系统,KASAN 是目前检查内存访问越界(Out-Of-Bound)和释放后访问(Use-After-Free)问题最有效的工具,KASAN 依赖编译器支持,当前 GCC-12.2 可以支持全功能的 KASAN,但是 KASAN 对性能和内存损耗非常严重,对于 slub 内存的使用问题,轻量级的 LUB_DEBUG 往往也能提供帮助,但功能比较受限且提供的信息也比较有限。
b> SoC 子系统间的内存踩踏:
- 在 征程 6X SoC 拥有 Acore、BPU、VDSP、Secure World(EL3)的多子系统 SoC, DDR 内存空间根据需求划分给不同子系统,如果子系统间内存出现踩踏,整机系统可能会出现各种随机异常;
- 征程 6X SoC 中使用 firewall 对 SoC 各子系统间的内存越界踩踏进行检测,当发生踩踏时由 EL3 触发 crash。
2.3. Watchdog
- 征程 6X SoC 中有 2 路 watchdog,目前使用 wdt0(监控 linux irq),wdt1(监控 linux 优先级为 50 的 rt kthread)。从/log/reset_reason.txt 中可以看到 wdt 的 reason:
2025-06-13-13-35-25: mwdt xxx@e9e8fadb9907 debug 20250610-193933 1100
- wdt 导致重启后,系统会保存 pstore log,通过检查 pstore 获取异常信息;
- wdt 狗咬中断/事件由 MCU 域处理,MCU 域进行重启。
- wdt0:一般是 kernel 中某个 CPU 处于长时间无法响应中断的状态,征程 6X 平台上在 wdt1 狗咬时间(IRQ_WDT_TIMEOUT)到后会触发一个 gic 中断,在这个中断中会使用 NMI 将所有 cpu 的调用栈打印;
- wdt1:一般是 kernel 中某个 CPU 处于长时间无法调度优先级为 50 的 rt kthread 的状态,征程 6X 平台上在 wdt2 狗咬时间(IRQ_WDT_TIMEOUT)到后会触发一个 gic 中断,在这个中断中会使用 NMI 将所有 cpu 的调用栈打印。
2.4 firewall
在 征程 6X SoC 拥有 Acore、BPU、GPU、VDSP0、Secure World(EL3)等多个子系统,DDR 内存空间根据需求划分给不同子系统。
如果子系统间内存/寄存器空间出现踩踏,整机系统可能会出现各种随机异常。firewall 是 征程 6X SoC 上的硬件单元,功能就是根据配置捕获子系统间的内存越界踩踏,当发生踩踏时由 EL3 触发 crash。
在 MCU 域的 log 中会输出发生越界访问的地址信息和 master 信息,输出示例如下:ID 为 0xd0 的 master 尝试读地址为 0x80000000 的内存空间。
MCU 域主动触发 firewall 违例:
markdown
horizon:/$ regread 0x80000000
MCU 域的违例信息 log:
markdown
[016.346991 0]firewall module 136 read violation master ID:d0
[016.347654 0]violation port 0[016.348004 0]violation addr high:0, low:80000000
[016.348656 0]Reg 0x80000000 value is 0x12345678
horizon:/$ [016.369156 0][M][time_1: 000016 s, 346 ms] Fchm Info occur (34, 30, 2552, 136)[016.370239 0][M][time_2: 000016 s, 348 ms] 136-6-CF Occur (34, 30, 2552), Payload(00-00-136-00 00-00-00-128 00-00-00-00 208-00-00-00)[016.371715 0]Customer handle(63, 1, 2)[016.421368 0][M][time_1: 000016 s, 348 ms] Fchm Info occur (36, 3, 2553, 349)[016.422437 0][M][time_2: 000016 s, 348 ms] 349-6-CF Occur (36, 3, 2553), Payload(00-00-00-00 00-00-00-00 00-00-00-00 00-00-00-00)[016.423894 0]Customer handle(51, 1, 2)
征程 6X 部分内存的 firewall 权限设置:
Master ID 定义,详见:hbbin_j6p/boot/j6p/bl31-dts/include/hobot_firewall.h。