詳解kernel中watchdog 驅動程式
watchdog無論在小系統還是大的工程系統中都是必須存在的,在解決執行緒掛死、系統死迴圈等都用很重要的應用,算是系統出問題恢復初始狀態的救命稻草。
在kernel中wdt的應用不是很常見,原因就是相比於裸系統來講,它的執行緒會出現一些非同步的情況,執行狀態容易出現系統不可控的時刻。
對於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)
{
int ret = -ENOTTY;
int time;
void __user *argp = (void __user *)arg;
int __user *p = argp;
switch (cmd) {
case WDIOC_GETSUPPORT:
ret = copy_to_user(argp, &at32_wdt_info,
sizeof(at32_wdt_info)) ? -EFAULT : 0;
break;
case WDIOC_GETSTATUS:
ret = put_user(0, p);
break;
case WDIOC_GETBOOTSTATUS:
ret = put_user(wdt->boot_status, p);
break;
case WDIOC_SETOPTIONS:
ret = get_user(time, p);
if (ret)
break;
if (time & WDIOS_DISABLECARD)
at32_wdt_stop();
if (time & WDIOS_ENABLECARD)
at32_wdt_start();
ret = 0;
break;
case WDIOC_KEEPALIVE:
at32_wdt_pat();
ret = 0;
break;
case WDIOC_SETTIMEOUT:
ret = get_user(time, p);
if (ret)
break;
ret = at32_wdt_settimeout(time);
if (ret)
break;
/* Enable new time value */
at32_wdt_start();
/* fall through */
case WDIOC_GETTIMEOUT:
ret = put_user(wdt->timeout, p);
break;
}
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)
{
spin_lock(&wdt->io_lock);
wdt_writel(wdt, CLR, 0x42);
spin_unlock(&wdt->io_lock);
}
這裡就能看出來就是想clr暫存器裡面寫一個0x42就等於是喂狗了
再來看看其他的函式吧
static int at32_wdt_settimeout(int time)
{
/*
* All counting occurs at 1 / SLOW_CLOCK (32 kHz) and max prescaler is
* 2 ^ 16 allowing up to 2 seconds timeout.
*/
if ((time < TIMEOUT_MIN) || (time > TIMEOUT_MAX))
return -EINVAL;
/*
* Set new watchdog time. It will be used when at32_wdt_start() is
* called.
*/
wdt->timeout = time;
return 0;
}
設定時間的函式就是判斷一下時間是不是超出範圍了 如果沒有就設定下去好了
start就不看了 就是啟動之前檢測一下是不是重啟時間有沒有設定 沒有的話就設定一個最大值
重點看一下關閉函式
static int at32_wdt_close(struct inode *inode, struct file *file)
{
if (expect_release == 42) {
at32_wdt_stop();
} else {
dev_dbg(wdt->miscdev.parent,
"unexpected close, not stopping watchdog!\n");
at32_wdt_pat();
}
clear_bit(1, &wdt->users);
expect_release = 0;
return 0;
}
這裡可以看到wdt 是一旦開啟就不能關閉的 這樣也是符合常理的 如果可以關閉 也就失去了存在的意義了 。存在被攻擊的可能。
下一次解釋下ioctl的方法
相關文章
- Binder 驅動詳解(下)
- Binder 驅動詳解(上)
- 詳解資料驅動
- Java開發中的事件驅動模型例項詳解Java事件模型
- linux引數之/proc/sys/kernel詳解Linux
- windows驅動註冊中斷服務程式Windows
- Windows XP 中查詢驅動程式資訊(轉)Windows
- 關於驅動程式中的ioctl (轉貼)
- Linux裝置驅動開發詳解:入門與程式設計實踐Linux程式設計
- nvidia驅動安裝過程中報已有nouveau驅動錯誤解決
- ODBC 驅動程式管理器 在指定的 DSN 中,驅動程式和應用程式之間的體系結構不匹配 解決方案
- 解決安裝驅動時提示的“未簽名的驅動程式”警告資訊!!
- 嵌入式Linux驅動筆記(十七)------詳解V4L2框架(UVC驅動)Linux筆記框架
- c#操作MangoDB 之MangoDB CSharp Driver驅動詳解C#GoCSharp
- DDD領域驅動最全詳解(圖文全面總結)
- 詳解Python中的程式Python
- kernel 啟動流程
- 再說驅動程式
- Windows驅動程式框架Windows框架
- 印表機驅動程式無法使用怎麼解決 印表機驅動程式無法使用w10
- 用perl寫的一個watchdog程式
- [Microsoft][ODBC 驅動程式管理器] 驅動程式不支援此功能ROS
- 基於Linux的tty架構及UART驅動詳解Linux架構
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- Linux 中殭屍程式詳解Linux
- extcon驅動及其在USB驅動中的應用
- 顯示卡驅動有必要更新嗎 顯示卡驅動怎麼更新詳細教程
- win7怎麼安裝adb驅動_win7安裝adb驅動步驟詳解Win7
- 事件驅動程式設計事件程式設計
- led驅動程式例項
- kernel 中ioctl應用
- 深入淺出分析Linux裝置驅動程式中斷Linux
- Redis 中的事件驅動模型Redis事件模型
- 詳解Linux作業系統裝置驅動相容性(轉)Linux作業系統
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 驅動程式開發步驟
- usb驅動程式初步編寫
- 【Camera專題】你應該熟悉的Camera驅動框架一(Hal層->kernel層)框架