详解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的方法

时间: 2024-10-07 05:46:23

详解kernel中watchdog 驱动程序的相关文章

具体解释kernel中watchdog 驱动程序

watchdog不管在小系统还是大的project系统中都是必须存在的.在解决线程挂死.系统死循环等都用非常重要的应用,算是系统出问题恢复初始状态的救命稻草. 在kernel中wdt的应用不是非经常见,原因就是相比于裸系统来讲.它的线程会出现一些异步的情况,执行状态easy出现系统不可控的时刻. 对于kernel中应用wdt而言,一般採用了一种通用方法.就是用一个timer进行喂狗操作. 下面选取一个典型的代码进行说明,就用 Atmel AT32AP700X device,在kernel->dr

详解Linux中的日志及用日志来排查错误的方法

这篇文章主要介绍了详解Linux中的日志及用日志来排查错误的方法,是Linux入门学习中的基础知识,需要的朋友可以参考下 Linux 系统日志许多有价值的日志文件都是由 Linux 自动地为你创建的.你可以在 /var/log 目录中找到它们.下面是在一个典型的 Ubuntu 系统中这个目录的样子: 一些最为重要的 Linux 系统日志包括: /var/log/syslog 或 /var/log/messages 存储所有的全局系统活动数据,包括开机信息.基于 Debian 的系统如 Ubunt

详解Android中那些酷炫返回方式的实现

Android手机都会有返回键,不管是实体键,还是虚拟键.Android用户主要也都是通过这个返回键操控页面返回方式的,不比IOS逼格甚高的只保留一个操作键.这种方式是最普遍的返回方式,还有一种也是比较常见的,那就是页面内部自己响应.绝大多数APP每个页面的设计图顶部左侧都会有一个返回键图标,偶尔也有奇葩的设计放在底部左侧,点击这个图标即finish掉当前页面.简单的介绍完了最常见的两种方式,下面为大家介绍两种更友好的交互方式. 拿大家比较常用的三款社交软件的交互来说.腾讯微博的返回方式除去上述

CSS学习笔记(9)--详解CSS中:nth-child的用法

详解CSS中:nth-child的用法 前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nth-child的实际用途: Tips:还用低版本的IE浏览器的哥们请绕过! :nth-child(2)选取第几个标签,"2可以是你想要的数字" .demo01 li:nth-child(2){background:#090} :nth-child(n

详解HTTP中get和post的区别

1.详解HTTP中GET和POST的区别 http://www.jellythink.com/archives/806 2.HTTP 方法:GET 对比 POST http://www.cnblogs.com/liu-ke/p/4198815.html

详解mysql中的Using与On的用法

多用才可以体会各个关键字的用法啊... 原文来自[http://bbs.php100.com/read-htm-tid-148469.html] 在用Join进行多表联合查询时,我们通常使用On来建立两个表的关系.其实还有一个更方便的关键字,那就是Using.那么这两个关键字在使用上有啥区别呢?往下看.假设有如下两张表:    mysql> select * from pets; +---------+---------+--------+-----------+ | pets_id | ani

详解Webwork中Action 调用的方法

详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultActionProxyFactory.DefaultActionProxy.DefaultActionInvocation 终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork

实例详解 EJB 中的六大事务传播属性--转

前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACID 的原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持续性(Durability)四大特性: 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(Consistency):事务必须是使数据库

一张图详解Linux中的top命令

一张图详解Linux中的top命令及每个参数的含义: