一
Watchdog
概念
Watchdog主要应用于嵌入式系统,用于系统出现严重故障(如内核死锁,进入死循环,CPU跑飞等)不能恢复时,在无人为介入的情况下可以自动重新启动系统。
在传统Linux 内核下, watchdog的基本工作原理是:当watchdog启动后(即/dev/watchdog 设备被打开后),如果在某一设定的时间间隔内/dev/watchdog没有被执行写操作, 硬件watchdog电路或软件定时器就会重新启动系统。
Watchdog根据实现方式又可以分为硬件watchdog和软件watchdog。硬件watchdog必须有硬件电路支持,设备节点/dev/watchdog对应真实的物理设备。软件watchdog通过通过内核定时器来实现,/dev/watchdog并不对应真实的物理设备。
硬件watchdog比软件watchdog有更好的可靠性。软件watchdog最大的优势是成本低,因此在可靠性要求不是很高一般民用产品被广泛使用。硬件watchdog的优势是可靠性高,因此在对可靠性要求严格的工业产品中被广泛使用。
但是在高通平台Android系统中,watchdog的实现有所不同,稍后我们会分析,这里只需知道其并没有提供/dev/watchdog。
当然在系统出现严重故障不能恢复时触发Watchdog,重启系统,仅仅是一个补救措施,虽然有效,但是过于简单粗暴,用户体验不佳
。
解决问题的最好方法是不让问题发生,因此我们需要针对watchdog进行和分析,尽量不让问题不发生。
注意Android系统中还有一套watchdog实现,也是使用软件实现的,用于检测SystemServer中各Service是否正常运行。大家不要搞混了。
如没有特别说明,本文后续提到的watchdog都特指高通平台Android系统kernel中watchdog。
二Watchdog的实现
2.0 Device Tree中watchdog的定义
wdog: qcom,wdt@17817000 {
compatible = "qcom,msm-watchdog";
reg = <0x17817000 0x1000>; //
没有查到对应寄存器的说明
reg-names = "wdt-base";
interrupts = <0 3 0>, <0 4 0>; //
狗叫和狗咬的中断,由于目前的实现是狗叫的同时就进行狗咬,所以只用到了狗叫的中断
qcom,bark-time = <11000>; //
超过
11
秒没有喂狗,连叫带咬,系统重启
qcom,pet-time = <10000>; //
每
10
秒喂狗一次
qcom,ipi-ping; //
喂狗时需要
ping
一下系统中的其他
cpu
,确保所有
cpu
都处于正常状态
qcom,wakeup-enable; //
看门狗具有唤醒系统的能力,如果不具备唤醒能力的话,需要在系统睡眠时关闭看门狗,唤醒时再重新打开看门狗
qcom,scandump-size = <0x40000>; // ramdump
相关
};
2.1核心数据结构struct msm_watchdog_data
Watchdog
的显示在
drivers/soc/qcom/watchdog_v2.c
源文件中。
struct msm_watchdog_data {
unsigned int __iomem phys_base; //
对应
dt
中的
reg
size_t size;
void __iomem *base; //
将的
phy_base
映射到虚拟地址空间
void __iomem *wdog_absent_base;
struct device *dev; //
指向
watchdog
的
device
unsigned int pet_time; //
对应
dt
中的
qcom,pet-time
unsigned int bark_time; //
对应
dt
中的
qcom,bark-time
unsigned int bark_irq; //
狗叫中断
unsigned int bite_irq; //
狗咬中断
bool do_ipi_ping; //
对应
dt
中的
qcom,ipi-ping
bool wakeup_irq_enable; //
对应
dt