簡體   English   中英

誰在Linux中刷新硬件看門狗?

[英]Who is refreshing hardware watchdog in Linux?

我有一個運行2.6內核的處理器AT91SAM9G20。 看門狗在引導級別啟用並配置為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

我們在kernel-2.6.25-ts.at91sam9g20 / kernel / softlockup.c中使用看門狗進行軟鎖定。

如果在內核中啟用了監視程序驅動程序,則監視程序驅動程序會設置內核計時器,負責重置監視程序。 相應的代碼在這里 它的工作原理如下:

如果沒有應用程序打開/ dev / watchdog文件,則內核負責重置監視程序。 由於它是一個計時器,它不會顯示為專用的內核線程,而是由軟IRQ線程處理。 現在,如果應用程序打開此文件,它將負責監視程序,並可以通過寫入文件來重置它,如Richard的帖子中鏈接的文檔所述。

是否在內核中配置了看門狗驅動程序? 如果沒有,你應該配置它,看看是否仍然發生重置。 如果它仍然發生,很可能你的重置來自其他地方。

如果你的內核太舊而沒有合適的看門狗驅動程序(2.6.25中沒有),你應該從2.6.28向后移植它。 或者您可以嘗試在引導加載程序中禁用看門狗,看看是否仍然發生了重置。

2016年7月,4.7內核中對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));

這可能會給你一個提示: http//www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt

讓用戶空間守護程序處理監視程序是完全合理的。 它可能默認為15分鍾超時。

我們在AT91SAM9263上有類似的WDT問題。 問題出在WDT_MR(地址:0xFFFFFD44)寄存器的bit 29 WDIDLEHLT上。 該位設置為1,但對於我們的應用需求,它應為0。

數據表文檔中的位說明:

•WDIDLEHLT:看門狗空閑停止

  1. 0:看門狗在系統處於空閑模式時運行。
  2. 1:看門狗在系統處於空閑狀態時停止。

這意味着當內核處於空閑狀態時WDT計數器不會遞增,因此直到復位發生15或更多延遲。

您可以嘗試“dd if = / dev / zero of = / dev / null”這將阻止內核進入空閑狀態,並且您應該在16秒內(或者您在WDT_MR寄存器中設置的任何時間段)進行重置。

因此,解決方案是更新u-boot代碼或設置WDT_MR寄存器的其他代碼。 記住這個寄存器只寫一次......

內核不會刷新看門狗定時器嗎? 看門狗設計用於在整個系統掛起時重置電路板,而不僅僅是單個應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM