论坛底层软件n2d 出现crash

n2d 出现crash

求助中
zealot18小时前
3
0

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)

{

value = atomic_read((atomic_t )atom); /* 此处崩溃 */

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 ← 崩溃

崩溃前最后观察到的发布帧号为 153600

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 ← 崩溃

崩溃前最后观察到的发布帧号为 99162

5. 已做的排查

两次非法地址都呈现 fffeffff... 的共同特征。以第二次为例:

异常地址: fffeffffca2c3880

疑似损坏前的地址: ffff0000ca2c3880

从数值形态看,疑似指针的高 32 位被减了 1。但尚未捕获损坏前的实际指针,这只是线索,不是已确认的根因。

我们在本地检查了 signal 生命周期,并补充了:

  • 完成回调和等待者使用期间的引用保护;

  • 防止所有者引用重复释放;

  • 查找、获取引用和最终释放之间的同步。

本地补充 signal 引用保护、防止重复销毁及释放同步后,已完成相同场景的实机验证,目前未再复现该 panic。希望官方确认这是否属于已知的 signal 生命周期竞态问题,以及是否有对应的正式补丁。

6. 想请教的问题

  1. 这个版本的 N2D 驱动是否有已知的 signal/vidmem 生命周期或完成回调竞态问题?

  2. 是否有人遇到过相同的 fffeffff... 指针异常?
  3. 多路旋转时,每帧执行 n2d_open()/n2d_close() 是否有使用限制或推荐方式?
  4. 是否有对应的官方补丁、推荐驱动版本,或者建议增加的调试信息?



附件:
底层软件
技术深度解析征程5
评论0
0/600