2010-01-07 13 views
15

मेरे पास एक प्रोसेसर AT91SAM9G20 2.6 कर्नेल चल रहा है। वॉचडॉग बूटस्ट्रैप स्तर पर सक्षम है और 16 सेकंड के लिए कॉन्फ़िगर किया गया है। वॉचडॉग मोड रजिस्टर केवल एक बार कॉन्फ़िगर किया जा सकता है। जब कोड बूटस्ट्रैप, बूटलोडर या कर्नेल में लटकता है, तो बोर्ड रीबूट करता है। लेकिन एक बार कर्नेल आता है, भले ही वॉचडॉग किसी भी एप्लिकेशन में रीफ्रेश नहीं होता है, बोर्ड को 16 सेकंड के बाद रीसेट नहीं किया जा रहा है, लेकिन 15 मिनट।लिनक्स में ताज़ा हार्डवेयर वॉचडॉग कौन है?

वॉचडॉग को ताज़ा कौन कर रहा है?

हमारे मामले में, वॉचडॉग अनुप्रयोगों से प्रभावित होना चाहिए, ताकि बोर्ड हमारे एप्लिकेशन को लटकने पर रीसेट कर सके।

ये चल प्रक्रियाओं हैं:

1 root  init 
2 root  [kthreadd] 
3 root  [ksoftirqd/0] 
4 root  [watchdog/0] 
5 root  [events/0] 
6 root  [khelper] 
63 root  [kblockd/0] 
72 root  [ksuspend_usbd] 
78 root  [khubd] 
85 root  [kmmcd] 
107 root  [pdflush] 
108 root  [pdflush] 
109 root  [kswapd0] 
110 root  [aio/0] 
740 root  [mtdblockd] 
828 root  [rpciod/0] 
982 root  [jffs2_gcd_mtd10] 
1003 root  /sbin/udevd -d 
1145 daemon portmap 
1158 dbus  dbus-daemon --system 
1178 root  /usr/sbin/ifplugd -i eth0 -fwI -u0 -d5 -l -q 
1190 root  /usr/sbin/ifplugd -i eth1 -fwI -u0 -d5 -l -q 
1221 default avahi-daemon: running [SP14.local] 
1226 root  /usr/sbin/dropbear 
1246 root  /root/bin/host_app 
1254 root  /root/bin/mini_httpd -c *.cgi -d /root/bin -u root -E /root/bin/ 
1256 root  -sh 
1257 root  /sbin/syslogd -n -m 0 
1258 root  /sbin/klogd -n 
1259 root  /usr/bin/tail -f /var/log/messages 
1265 root  ps -e 

हम कर्नेल 2.6.25-ts.at91sam9g20 में उपलब्ध नरम लाकअप के लिए निगरानी का उपयोग कर रहे/कर्नेल/softlockup.c

उत्तर

0

चाहेंगे नहीं कर्नेल वॉचडॉग टाइमर रीफ्रेश कर रहा है? वॉचडॉग बोर्ड को रीसेट करने के लिए डिज़ाइन किया गया है यदि पूरी प्रणाली लटकती है, केवल एक ही एप्लिकेशन नहीं। http://www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt

यह सही समझ में आता है एक उपयोगकर्ता अंतरिक्ष डेमॉन प्रहरी से निपटने के लिए:

+1

मैंने पूरे कर्नेल कोड की खोज की। मुझे कर्नेल में ऐसी कोई चीज़ नहीं मिली। अगर ऐसा ही मामला है तो यह 15 मिनट के बाद रीसेट क्यों कर रहा है? – Shashikiran

6

यह आपको एक संकेत दे सकता है। यह शायद 15 मिनट के टाइमआउट पर चूक जाता है।

+1

उपयोगकर्ता स्थान में कोई वॉचडॉग डिमन चल रहा है। – Shashikiran

+1

तो 15 मिनट के बाद सिस्टम रीबूट होने पर लॉग में कोई संदेश नहीं है? वह अजीब है। –

+1

9 जी 20 एक एम्बेडेड प्रोसेसर है, और शायद एक रैमडिस्क रूट वॉल्यूम है। इसमें लगातार लॉग नहीं हो सकता है। –

14

यदि आपने अपने कर्नेल में वॉचडॉग ड्राइवर सक्षम किया है, तो वॉचडॉग ड्राइवर वॉचडॉग को रीसेट करने के प्रभारी कर्नेल टाइमर सेट करता है। संबंधित कोड here है। तो यह इस तरह काम करता है:

यदि कोई एप्लिकेशन/dev/watchdog फ़ाइल खोलता है, तो कर्नेल वॉचडॉग को रीसेट करने का ख्याल रखता है। चूंकि यह एक टाइमर है, यह एक समर्पित कर्नेल थ्रेड के रूप में नहीं दिखाई देगा, लेकिन मुलायम आईआरक्यू थ्रेड द्वारा संभाला जाएगा। अब, यदि कोई एप्लिकेशन इस फ़ाइल को खोलता है, तो यह वॉचडॉग के लिए ज़िम्मेदार हो जाता है, और इसे फ़ाइल में लिखकर रीसेट कर सकता है, जैसा कि रिचर्ड के पोस्ट में जुड़े दस्तावेज द्वारा दस्तावेज किया गया है।

क्या वॉचडॉग ड्राइवर आपके कर्नेल में कॉन्फ़िगर किया गया है? यदि नहीं, तो आपको इसे कॉन्फ़िगर करना चाहिए, और देखें कि रीसेट अभी भी होता है या नहीं। यदि यह अभी भी होता है, तो संभव है कि आपका रीसेट कहीं और से आता है।

यदि आपका कर्नेल एक उचित वॉचडॉग ड्राइवर (2.6.25 में मौजूद नहीं है) के लिए बहुत पुराना है तो आपको इसे 2.6.28 से बैकपोर्ट करना चाहिए। या आप अपने बूटलोडर में वॉचडॉग को अक्षम करने का प्रयास कर सकते हैं और देख सकते हैं कि रीसेट अभी भी होता है या नहीं।

+0

वॉचडॉग रजिस्टर बूटस्ट्रैप में कॉन्फ़िगर किया गया है। मोड रजिस्टर एक बार लिखना है। जहां कर्नेल रीफ्रेशिंग वॉचडॉग है। हमारे कर्नेल कोड स्थिर शून्य at91_ping (हस्ताक्षरित लंबे डेटा) फ़ंक्शन मौजूद नहीं है। क्या ताज़ा करना बंद करने के लिए कर्नेल को अवरुद्ध करना संभव है? – Shashikiran

2

हमें AT91SAM9263 पर डब्लूडीटी के संबंध में एक ही समस्या थी। WDT_MR (पता: 0xFFFFFD44) रजिस्टर के बिट 29 WDIDLEHLT के साथ समस्या थी। यह बिट 1 पर सेट किया गया था लेकिन यह हमारी आवेदन आवश्यकताओं के लिए 0 होना चाहिए। डेटापत्रक प्रलेखन से

बिट स्पष्टीकरण:

• WDIDLEHLT: वॉचडॉग निष्क्रिय हॉल्ट

  1. 0: वॉचडॉग चलता है जब प्रणाली बेकार मोड में है।
  2. 1: सिस्टम निष्क्रिय होने पर वॉचडॉग बंद हो जाता है।

इसका मतलब है कि कर्नेल निष्क्रिय स्थिति में होने पर डब्लूडीटी काउंटर बढ़ता नहीं है, इसलिए रीसेट होने तक 15 या अधिक देरी होती है।

आप "dd if =/dev/zero = = dev/null" का प्रयास कर सकते हैं जो कर्नेल को निष्क्रिय स्थिति में प्रवेश करने से रोक देगा और आपको 16 सेकंड में रीसेट करना चाहिए (या जो भी अवधि आपने WDT_MR रजिस्टर में सेट की है) ।

तो, समाधान यू-बूट कोड या कोड के अन्य टुकड़े को अपडेट करना है जो WDT_MR रजिस्टर सेट करता है। याद रखें कि यह रजिस्टर एक बार लिखता है ...

6

जुलाई 2016 में a commit in the 4.7 kernel watchdog_dev.c को सभी वॉचडॉग टाइमर ड्राइवरों के लिए shodanex के उत्तर के समान व्यवहार सक्षम करता है। ऐसा लगता है कि यह थ्रेड और स्रोत कोड के अलावा कहीं भी दस्तावेज नहीं है।

/* 
* A worker to generate heartbeat requests is needed if all of the 
* following conditions are true. 
* - Userspace activated the watchdog. 
* - The driver provided a value for the maximum hardware timeout, and 
* thus is aware that the framework supports generating heartbeat 
* requests. 
* - Userspace requests a longer timeout than the hardware can handle. 
* 
* Alternatively, if userspace has not opened the watchdog 
* device, we take care of feeding the watchdog if it is 
* running. 
*/ 

return (hm && watchdog_active(wdd) && t > hm) || 
     (t && !watchdog_active(wdd) && watchdog_hw_running(wdd)); 
संबंधित मुद्दे