具體解釋kernel中watchdog 驅動程式

2021-09-07 11:33:45 字數 1540 閱讀 9166

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,數字...