1. 环境与复现方式
项目 | 信息 |
|---|---|
平台 | X5,自定义板卡 |
内核 | 6.1.83-DR-PL5.2_V1.1.2 |
场景 | 两路摄像头采集,经 N2D 做 270°旋转,同时运行检测、分割和 ROS 2 图像发布 |
复现方式 | 保持上述流程连续运行 |
复现频率 | 通常约 1~3 小时;两次日志的崩溃时间分别为开机后约 56 分钟、91 分钟 |
表现 | vio_n2d 访问非法地址,触发 Kernel Panic,5 秒后自动重启 |
崩溃前,双摄图像和推理结果仍在正常发布。
目前尚未确认使用官方未修改镜像是否同样复现。
2. 两次崩溃发生在同一个位置
pc : n2d_kernel_os_atom_get+0x0/0x1c [vio_n2d]
lr : n2d_kernel_vidmem_node_unmap+0x48/0x34c [vio_n2d]
对应源码为:
/* nano2Dkernel/linux/nano2D_kernel_os.c,约第 213 行 */
n2d_error_t n2d_kernel_os_atom_get(n2d_os_t *os,
n2d_pointer atom,
n2d_int32_t *value)
{
return N2D_SUCCESS;
}
调用处:
源码根目录:
kernel/drivers/misc/verisilicon/gc820/
3. 第一次:释放命令缓冲区时崩溃
[5456.131317] Unable to handle kernel paging request at virtual address fffeffffc5891400
[5456.134674] FSC = 0x04: level 0 translation fault
[5456.136527] [fffeffffc5891400] address between user and kernel address ranges
[5456.145113] CPU: 1 PID: 304 Comm: n2d_framework/0
[5456.147858] pc : n2d_kernel_os_atom_get+0x0/0x1c [vio_n2d]
[5456.148606] lr : n2d_kernel_vidmem_node_unmap+0x48/0x34c [vio_n2d]
[5456.158023] x1 : fffeffffc5891400
[5456.186484] Kernel panic - not syncing: Oops: Fatal exception
调用链按调用方向整理:
n2d_frame_work
→ n2d_close
→ _gcFreeEngine
→ gcDeinitHardware
→ gcDestroySurfaceCmdBuf
→ gcDestroyCmdBuf
→ gcUnmapMemory
→ n2d_user_os_ioctl
→ drv_ioctl_internal
→ n2d_kernel_dispatch
→ do_unmap
→ n2d_kernel_vidmem_node_unmap
→ n2d_kernel_os_atom_get ← 崩溃
4. 第二次:旋转路径释放图像缓冲区时崩溃
[3378.351639] Unable to handle kernel paging request at virtual address fffeffffca2c3880
[3378.355590] FSC = 0x04: level 0 translation fault
[3378.356824] [fffeffffca2c3880] address between user and kernel address ranges
[3378.365411] CPU: 4 PID: 310 Comm: n2d_framework/1
[3378.368160] pc : n2d_kernel_os_atom_get+0x0/0x1c [vio_n2d]
[3378.368918] lr : n2d_kernel_vidmem_node_unmap+0x48/0x34c [vio_n2d]
[3378.378342] x1 : fffeffffca2c3880
[3378.407660] Kernel panic - not syncing: Oops: Fatal exception
调用链:
n2d_frame_work
→ do_rotate
→ n2d_free
→ gcUnmapMemory
→ n2d_user_os_ioctl
→ drv_ioctl_internal
→ n2d_kernel_dispatch
→ do_unmap
→ n2d_kernel_vidmem_node_unmap
→ n2d_kernel_os_atom_get ← 崩溃
5. 已做的排查
异常地址: fffeffffca2c3880
疑似损坏前的地址: ffff0000ca2c3880
我们在本地检查了 signal 生命周期,并补充了:
完成回调和等待者使用期间的引用保护;
防止所有者引用重复释放;
查找、获取引用和最终释放之间的同步。
本地补充 signal 引用保护、防止重复销毁及释放同步后,已完成相同场景的实机验证,目前未再复现该 panic。希望官方确认这是否属于已知的 signal 生命周期竞态问题,以及是否有对应的正式补丁。
6. 想请教的问题
这个版本的 N2D 驱动是否有已知的 signal/vidmem 生命周期或完成回调竞态问题?
- 是否有人遇到过相同的 fffeffff... 指针异常?
- 多路旋转时,每帧执行 n2d_open()/n2d_close() 是否有使用限制或推荐方式?
- 是否有对应的官方补丁、推荐驱动版本,或者建议增加的调试信息?