利用hardware watchdog debug kernel bug


本文根据watchdog特性讨论 内核开发过程当中watchdog更多的应用场景

watchdog由内核线程负责定时喂狗,但当出现极端事件导致cpu无法调度到喂狗线程时会出现什么情况?解析如下

s3c2410硬件Watchdog通过利用内部定时器定时复位,通常用于检查调试cpu是否hung 或者关中断情况下while死循环导致系统无法正常运行。在内核编程中,可以通过内核线程定时给watchdog的复位清零, 使得watchdog计数器永远不会被复位,当内核出现cpu hung或者死循环导致无法调度时,内核线程无法被调度用于喂狗则会导致watchdog复位重启或者产生 watchdog中断(watchdog reset设置为中断)
1、对于中断关闭情况下的CPU Hang,在没有FIQ的情况下(目前支持Trustzone的ARM都未能支持FIQ),唯一的办法是通过Watchdog恢复系统,而无法找到相关的内核场景,只能通过printk一步一步地分析。
2、不过有些其他情况也可能导致硬件Watchdog的喂狗线程无法喂狗而造成Watchdog重启,例如,中断风暴,由于中断的优先级最高,如果中断特别频繁,将会导致整个内核无法调度,从而block掉喂狗线程。对于这类情况,如果中断没有关闭,是可以通过Watchdog IRQ模式来获取一些内核现场的,可以设置watchdog启用irq模式, 即soft_noboot=1,并且在中断处理函数加入以下两条语句,用于在irq中断中打印每个cpu的回调信息信息, 以便我们计时找出cpu hung的原因。   

  1. /* Clear the interrupt */  
  2. s3c2410wdt_int_clear(&s3c2410_wdd);  
  3. /* Print backtrace of all cpus. */  
  4. handle_sysrq('l');  

  1. static irqreturn_t s3c2410wdt_irq(int irqno, void *param)  
  2. {  
  3.         dev_info(wdt_dev, "watchdog timer expired (irq)\n");  
  4.         s3c2410wdt_keepalive(&s3c2410_wdd);  
  5.   
  6.         /* Clear the interrupt */  
  7.         s3c2410wdt_int_clear(&s3c2410_wdd);  
  8.   
  9.         /* Print backtrace of all cpus. */  
  10.         handle_sysrq('l');  
  11.   
  12.         return IRQ_HANDLED;  
  13. }  



你可能感兴趣的:(linux,Kernel,Panic)