1. 学习目标
- 理解 Watchdog 的作用
理解 Watchdog 的核心用途:
系统死机检测
自动重启系统
系统可靠性保障
- 理解 Linux Watchdog 子系统架构
理解 Watchdog 驱动结构:
User Space
│
▼
Watchdog Core
│
▼
Watchdog Driver
│
▼
Hardware
- 理解 Watchdog 核心结构
掌握核心对象:
watchdog_device
watchdog_ops
watchdog_info
- 能编写简单 Watchdog 驱动
掌握 API:
watchdog_register_device
watchdog_ping
watchdog_start
watchdog_stop
- 能使用用户空间工具控制 Watchdog
掌握设备:
/dev/watchdog
2. Watchdog 简介
Watchdog (看门狗)是一种:
硬件定时器
工作原理:
系统定期喂狗
如果系统没有喂狗:
定时器超时
则:
系统自动复位
Watchdog 工作流程
基本流程:
系统启动
│
▼
启动 Watchdog
│
▼
定期喂狗
│
▼
系统正常运行
如果系统死机:
没有喂狗
则:
Watchdog Reset
3. Linux Watchdog 子系统架构
Linux Watchdog 子系统结构:
User Space
│
▼
Watchdog Core
│
▼
Watchdog Driver
│
▼
Watchdog Hardware
用户空间设备:
/dev/watchdog
4. Watchdog 核心结构
Watchdog 子系统核心结构:
watchdog_device
watchdog_ops
watchdog_info
5. watchdog_device
watchdog_device 表示:
Watchdog 设备
结构:
struct watchdog_device
{
const struct watchdog_ops *ops;
unsigned int timeout;
};
关键成员:
timeout
表示:
Watchdog 超时时间
6. watchdog_ops
watchdog_ops 表示:
Watchdog 操作接口
结构:
struct watchdog_ops
{
int (*start)(struct watchdog_device *);
int (*stop)(struct watchdog_device *);
int (*ping)(struct watchdog_device *);
};
主要操作:
启动 Watchdog
停止 Watchdog
喂狗
7. watchdog_info
watchdog_info 表示:
Watchdog 信息
结构:
struct watchdog_info
{
unsigned int options;
const char *identity;
};
例如:
设备名称
支持功能
8. Watchdog 驱动注册流程
Watchdog 驱动基本流程:
初始化驱动
│
注册 watchdog_device
│
Watchdog Core
│
生成 /dev/watchdog
流程图:
Watchdog Driver
│
▼
watchdog_register_device
│
▼
Watchdog Core
│
▼
/dev/watchdog
9. Watchdog 启动
驱动实现:
watchdog_start()
示例:
static int my_wdt_start(struct watchdog_device *wdt)
{
printk("watchdog start\n");
return 0;
}
10. Watchdog 停止
驱动实现:
watchdog_stop()
示例:
static int my_wdt_start(struct watchdog_device *wdt)
{
printk("watchdog start\n");
return 0;
}
11. Watchdog 喂狗
驱动实现:
watchdog_ping()
示例:
static int my_wdt_stop(struct watchdog_device *wdt)
{
printk("watchdog stop\n");
return 0;
}
12. Watchdog 驱动示例
简单 Watchdog 驱动结构:
static const struct watchdog_ops my_wdt_ops =
{
.start = my_wdt_start,
.stop = my_wdt_stop,
.ping = my_wdt_ping,
};
static struct watchdog_device my_wdt_dev =
{
.ops = &my_wdt_ops,
.timeout = 10,
};
static int __init my_wdt_init(void)
{
watchdog_register_device(&my_wdt_dev);
return 0;
}
13. 用户空间访问
Linux Watchdog 设备:
/dev/watchdog
喂狗方法:
write("/dev/watchdog")
示例:
echo 1 > /dev/watchdog
watchdog 工具
Linux 提供工具:
watchdog
配置:
/etc/watchdog.conf
14. Watchdog 自动重启机制
如果系统:
死机
无法执行:
ping
则:
Watchdog timeout
触发:
System Reset
15. Device Tree 描述 Watchdog
Watchdog 设备通常在 Device Tree 中描述。
示例:
watchdog@10030000
{
compatible = "my-watchdog";
reg = <0x10030000 0x1000>;
};
16. Watchdog 子系统结构总结
Watchdog 子系统结构:
User Space
│
▼
Watchdog Core
│
▼
Watchdog Driver
│
▼
Hardware
核心结构:
watchdog_device
watchdog_ops
watchdog_info
17. 驱动常见问题
Watchdog 无法启动
原因:
start 函数没有实现
Watchdog 不重启系统
原因:
硬件 reset 未配置
Watchdog 自动关闭
原因:
驱动 stop 被调用
18. 总结
Linux Watchdog 子系统核心结构:
watchdog_device
watchdog_ops
watchdog_info
关系:
Watchdog Core
│
▼
Watchdog Driver
│
▼
Hardware
最重要原则:
Watchdog 驱动 = Watchdog Core + Watchdog Hardware
19. Q&A
19.1 基础理解
-
Watchdog 为什么可以防止系统死机?
-
为什么必须定期喂狗?
19.2 Linux 架构
-
watchdog_device 表示什么?
-
watchdog_ops 的作用是什么?
19.3 驱动流程
-
watchdog_register_device 做了什么?
-
watchdog_ping 的作用是什么?