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)

{

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

具体解释kernel中watchdog 驱动程序的更多相关文章

  1. kernel:NMI watchdog: BUG: soft lockup - CPU#6 stuck for 28s! CentOS7linux中内核被锁死

    环境说明:虚拟机 CentOS7中解压一个8G的包时,内核报错 Message from syslogd@cosmo-01 at Apr 25 11:05:59 ... kernel:NMI watc ...

  2. Linux kernel中网络设备的管理

    kernel中使用net_device结构来描述网络设备,这个结构是网络驱动及接口层中最重要的结构.该结构不仅描述了接口方面的信息,还包括硬件信息,致使该结构很大很复杂.通过这个结构,内核在底层的网络 ...

  3. kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  4. (六)kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  5. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  6. 在 CUDA C/C++ kernel中使用内存

    在 CUDA C/C++ kernel中使用内存 如何在主机和设备之间高效地移动数据.本文将讨论如何有效地从内核中访问设备存储器,特别是 全局内存 . 在 CUDA 设备上有几种内存,每种内存的作用域 ...

  7. java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

    今天把sql server 2008 r2装了起来,64位的,然后就迫不及待地体验连接数据库的操作,编程语言是java.我一开始学了一种非常老的连接方式,使用JDBC-ODBC桥.初次使用不太熟练,所 ...

  8. [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

    环境:  操作系统:64位WIN7   数据库:SQL Server 2000 SP1  开发语言:J2EE 在Servlet连接数据库时出错提示:  [Microsoft][ODBC 驱动程序管理器 ...

  9. 嵌入式 hi3518c平台网卡模式MII与RMII模式在Uboot和kernel中切换小结

    由于公司项目的需要,我们需要在原有的MII的基础上,修改为RMII模式,针对hi3518c平台,我的网卡是LAN8701需要修改的地方有如下几个: 首先我的uboot中env是: bootargs=m ...

随机推荐

  1. 用antlr4来实现《按编译原理的思路设计的一个计算器》中的计算器

    上次在公司内部讲<词法分析——使用正则文法>是一次失败的尝试——上午有十几个人在场,下午就只来了四个听众. 本来我还在构思如何来讲“语法分析”的知识呢,但现在看来已不太可能. 这个课程没有 ...

  2. Statement和PreparedStatement深入学习总结

    最近在看java安全编码方面的书籍,在看到SQL注入漏洞的问题时,引发了我对Statement和PreparedStatement深入总结的欲望,废话少说,下面咱们就正式开始. 当初始的SQL查询被修 ...

  3. Jenkins系列之Jenkins的安装(一)

    自动化测试的时候通常我们都会进行持续集成,下面是持续集成工具Jenkins的安装 Jenkins优点: 开源免费 跨平台,支持所有的平台 web形式的可视化的管理页面 安装配置超级简单 tips及时快 ...

  4. CAD得到所有组名(网页版)

    主要用到函数说明: _DMxDrawX::GetAllGroupName 得到所有组名. js代码实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  5. JavaScipt30(第十八个案例)(主要知识点:Array.prototype.map)

    承接上文,这是第十八个案例,中间的十到十八我直接看了答案,因为有些例子从他打开的页面看不出他要做什么. 附上项目链接: https://github.com/wesbos/JavaScript30 这 ...

  6. MS SQL Server查询 本日、本周、本月、本季度、本年起始时间

    参数声明 declare @beginTime datetime, --查询开始时间 @endTime datetime, --查询结束时间 @queryTimeType tinyint; --查询时 ...

  7. Leetcode 498:对角线遍历Diagonal Traverse(python3、java)

    对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. Given a matrix of M x N elemen ...

  8. CCF201703-1 分蛋糕 java(100分)

    试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别 ...

  9. python3返回值中的none

    浏览器返回null,python3返回none,懵了. google了很多资料,不明就里,这就是没基础的后果啊呀呀呀. 上阮一峰的截图,就这么理解下凑合吧:

  10. 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)-----https://www.cnblogs.com/JavaArchitect/p/9080484.html

    https://www.cnblogs.com/JavaArchitect/p/9080484.html 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)