watchdog不管在小系統還是大的project系統中都是必須存在的。在解決執行緒掛死、系統死迴圈等都用非常重要的應用,算是系統出問題恢復初始狀態的救命稻草。
在kernel中wdt的應用不是非經常見,原因就是相比於裸系統來講。它的執行緒會出現一些非同步的情況,執行狀態easy出現系統不可控的時刻。
對於kernel中應用wdt而言,一般採用了一種通用方法。就是用乙個timer進行餵狗操作。
下面選取乙個典型的**進行說明,就用 atmel at32ap700x device,在kernel-》drivers-》watchdog->at32ap700x_wdt.c
它的操作方法呼叫方法是不支援檔案操作的,一般執行ioctl的方式進行呼叫
static long at32_wdt_ioctl(struct file *file,
unsigned int cmd, unsigned long arg)
return ret;
}上面就是函式的樣子,這裡能夠看到主要的命令就是
wdt_settimeout 設定看門狗的最長餵狗時間
wdt_keepalive 餵狗函式命令
他們都相應了自己的函式,這樣就能夠在上層進行呼叫了。
接著向下分析。wdt_settimeout
get_user(time, p);
if (ret)
break;
ret = at32_wdt_settimeout(time);
if (ret)
break;
/* enable new time value */
at32_wdt_start();
呼叫了三個函式 依次的作用是
get_user(time, p); 檢視狀態
at32_wdt_settimeout(time); 設定時間間隔
at32_wdt_start();勢能看門狗
函式還是能從名字看出來作用的
餵狗函式相同的就是at32_wdt_pat()
這裡走進去看一下 static inline void at32_wdt_pat(void)
這裡就能看出來就是想clr暫存器裡面寫乙個0x42就等於是餵狗了
再來看看其它的函式吧
static int at32_wdt_settimeout(int time)
設定時間的函式就是推斷一下時間是不是超出範圍了 假設沒有就設定下去好了
start就不看了 就是啟動之前檢測一下是不是重新啟動時間有沒有設定 沒有的話就設定乙個最大值
重點看一下關閉函式
static int at32_wdt_close(struct inode *inode, struct file *file)
else
clear_bit(1, &wdt->users);
expect_release = 0;
return 0;
}這裡能夠看到wdt 是一旦開啟就不能關閉的 這樣也是符合常理的 假設能夠關閉 也就失去了存在的意義了 。存在被攻擊的可能。
下一次解釋下ioctl的方法
linux diff具體解釋
diff是unix系統的乙個非常重要的工具程式。它用來比較兩個文字檔案的差異,是 版本號管理的基石之中的乙個。你在命令列下,輸入 diff 變動前的檔案 變動後的檔案 diff就會告訴你,這兩個檔案有何差異。它的顯示結果不太好懂,以下我就來說明,怎樣讀懂diff。一 diff的三種格式 因為歷史原因...
linux select具體解釋
linux select 具體解釋 select 系統呼叫時用來讓我們的程式監視多個檔案控制代碼的狀態變化的。程式會停在 select 這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。關於檔案控制代碼,事實上就是乙個整數,通過 socket 函式的宣告就明確了 int socket i...
htons函式具體解釋
part 1 htons函式具體解釋 在linux和windows網路程式設計時需要用到htons和htonl函式,用來將主機位元組順序轉換為網路位元組順序。在intel機器下,執行以下程式 int main 得到的結果是4096,初一看感覺很怪。解釋如下,數字16的16進製表示為0x0010,數字...