Android系统高通平台Kernel Watchdog


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 Treewatchdog的定义

       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
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值