Reboot 卡死问题分析
问题现象
设备:192.168.0.89
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
39.940000] PC is at yaffs_tags_marshall_write+0xc0/0xdc
39.940000] LR is at yaffs2_checkpt_flush_buffer+0x9c/0x294
39.940000] pc : []
lr : []
psr: 60000013
39.940000] [] (yaffs_tags_marshall_write+0x0/0xdc) from [] (yaffs2_checkpt_flush_buffer+0x9c/0x294)
39.940000]
r9:c16915ec r8:00000001 r7:c16915f0 r6:0000004d r5:0000a18c
39.940000] r4:c62ea000
39.940000] [] (yaffs2_checkpt_flush_buffer+0x0/0x294) from [] (yaffs_checkpt_close+0x2c/0x130)
39.940000]
r7:c16915f0 r6:c62ea000 r5:c6363388 r4:c62ea000
39.940000] [] (yaffs_checkpt_close+0x0/0x130) from [] (yaffs_checkpoint_save+0x140/0x504)
39.940000]
r4:c62d93cc r3:00000000
39.940000] [] (yaffs_checkpoint_save+0x0/0x504) from [] (yaffs_flush_super+0x8c/0xa8)
39.940000] [] (yaffs_flush_super+0x0/0xa8) from [] (yaffs_sync_fs+0xd8/0x1b8)
39.940000]
r9:00000001 r8:00000000 r7:00000001 r6:c62d9400 r5:c16915ec
39.940000] r4:c62ea000
39.940000] [] (yaffs_sync_fs+0x0/0x1b8) from [] (sync_fs_one_sb+0x30/0x34)
39.940000] [] (sync_fs_one_sb+0x0/0x34) from [] (iterate_supers+0xec/0x16c)
39.940000] [] (iterate_supers+0x0/0x16c) from [] (sys_sync+0x44/0xa0)
39.940000] [] (sys_sync+0x0/0xa0) from [] (ret_fast_syscall+0x0/0x34)
39.940000]
r4:00000002
[
39.940000] Code: e1a01006 e0850000 ebfffb71 eaffffec (e7f001f2)
问题分析;
首先了解一下 reboot 的调用流程,详见以下链接
Reboot 在进行调用的时候会调用 busybox 中 run_shutdown_and_kill_process 函数
该函数功能实现如下
Reboot 复位主要有三点
1. 发送 kill 信号
2. Sync 同步
3. 调用内核处理 restart 流程
我们问题出现在 sync 同步过程----》运行 yaffs tag 功能(用于记录文件信息)
经过信息收集,现场反馈设备网络不通,很有可能是另外一种现象。
在清明节 4.4~4.6 日搭建 4 台设备,开启 soap 服务,发现其中一台设备串口卡死,ip 无法
ping 通,怀疑和设备的日志系统重启守护进程有关。该现象和现场出问题反馈的问题相似。
解决方法
1. 应用层主要出现在对 reboot 调电处理不严谨造成,应用程序需要对 reboot 掉电流程进行
优化,以保证系统数据的稳定性
2. 内核层修改日志记录方式。
Reboot 使用之前做掉电处理,必须卸载 yaffs、必须卸
载 sd 卡、关闭网络和串口,同时进行线程和进程的资
源释放
具体应用关键流程如下