当前位置: 首页 > article >正文

Linux WDT 软件分析

linux WDT看门狗看门狗子系统为什么要实现看门狗子系统因为要实现linux底层对WDT 不同硬件的统一控制在driver部分中最终回去调用watchdog_devwdt 代码解析结构体使用场景和Attentionstructxxxwdd_data;// 先定义数据本体wddwdd_data;// 把wdd_data的地址赋值给指针wdd// 场景1函数内临时使用小结构体 → 用变量voidset_short_config(){structxxxwdd;// 栈上变量用完就销毁wdd.id1;wdd.timeout1000;// 临时使用无需传递 → 直接用变量更简单}// 场景2函数间传递配置 → 用指针避免拷贝voidset_hardware_config(structxxx*wdd){if(wddNULL){// 必加空指针检查防止踩地址return;}wdd-id2;wdd-timeout2000;}// 场景3动态分配内核中→ 用指针structxxx*create_hardware_instance(){// 堆内存分配内核用kmalloc用户态用mallocstructxxx*wddkmalloc(sizeof(structxxx),GFP_KERNEL);if(wddNULL){// 检查分配是否成功returnNULL;}// 初始化指针指向的结构体wdd-id3;wdd-timeout3000;returnwdd;// 返回指针数据不会随函数结束销毁}//attention1.野指针解引用structxxx*wdd;wdd-id1;// 错误指针没指向任何有效内存直接踩地址崩溃//修复先赋值地址再加空指针检查//attention2.返回栈变量的指针structxxx*get_wdd(){structxxxwdd;// 栈变量函数结束就销毁returnwdd;// 返回野指针后续访问必出问题}//修复用 kmalloc/malloc 分配堆内存或让调用方传入指针//attention3.混淆 . 和 -structxxxwdd;wdd-id1;// 错误变量用.指针用-structxxx*wdd_ptrwdd;wdd_ptr.id1;// 错误指针用-在设备树 .dtsi 文件中定义硬件的地址其中 0x0 … 对应的地址信息进行匹配probe函数其中的dw_wdt_of_match结构体中的 snp,dw-wdt和.dtsi下的匹配//define the watchdog infostructwatchdog_info{...}//函数操作集合 原厂工程师实现structwatchdog_ops{...}//看门狗管理者 重启系统的函数structwatchdog_governor{...//重启系统之前调用void[*pretimeout]{strcut watchdog_device*wdd}}//实现的对 wdd的watchdog_device封装 作为硬件的启动驱动structwd_wdt{...strcut watchdog_device wdd}memplatform_get_resource(pdev,IORESOURCE_MEM,0);//获取 ./dtsi 中的设备地址信息其中的看门狗信息可由 watchdog_info结构体进行获取赋值 代码如下获取看门狗信息wdd-infodw_wdt_ident;//设置最小时间wdd-min_timeout1//设置最大时间wdd-max_hw_heartbeat_msdw_wdt_top_in_seconds(dw_wdt,DW_WHT_MAX_TOP)*1000;wdd-parentdev设置看门狗参数看门狗不停止//需要设置禁止停止时候WDOG_NO_WAY_OUT该参数的设置需要在linux mkconfig中打开config watchdog nowayoff 选项看门狗优先级//设置优先级watchdog_set_restart_priority()在设置不同 优先级0 128 256 后系统内核会决定用哪个函数来进行重启。//设置下列函数后watchdog_set_drvdate(wdd,dw_wdt);//可以用下列函数获取结构体watchdog_get_drvdate(wdd,dw_wdt);看门狗核心代码看门狗初始化代码staticint__initwatchdog_init(void){init err;errwatchdog_dev_init();if(err0)return0;watchdog_deferred_registration();return0;}id 号重分配机制staticint__initwatchdog_init(void){init err;errwatchdog_dev_init();if(err0)return0;watchdog_deferred_registration();return0;}在获取到wdd id 后可以进行调用ida_simple_get(watchdog_ida, 0, MAX_DOGS, GFP_KERNEL);初始值为 id为-1 在 id1 时会进行有一次的id分配代码如下所示调用的注册函数后注册判断获取成功后进行wdd-id id 的赋值再进行注册wdd如果失败 再获取一次 再注册看门狗停止判断系统重启时候的看门狗状态if(test_bit(WDOG_STOP_ON_REBOOT,wdd-status)){if(!wdd-ops-stop)pr_warn(watchdog%d:stop_on_reboot not supported\n,wdd-id);else{wdd-reboot_nb.notifier_callwatchdog_reboot_notifier;retregister_reboot_notifier(wdd-reboot_nb);if(ret){pr_err(watchdog%d:cannot not register reboot notifier(%d)\n,wdd-id,ret);watchdog_dev_unregister(wdd);ida_simple_remove(watchdog_ida,id);returnret}}}if(wdd-ops-start){wdd-restart_nb-restart_handler(wdd-restart_nb);retregister_restart_handler(wdd-restart_nb);if(ret)pr_warn(watchdog%d: Cannot register restart handler (%d)\n,wdd-id,ret);}以上代码是进行对系统重启时候的stop函数存在判断如果有则注册回调函数 watchdog_reboot_notifier 在启动时进行调用回调函数如果有(wdd- ops-start) 则注册在重置系统时候进行回调函数register_restart_handler初始化看门狗进行看门狗设dev_init采用kthread_create_worker(0, watchdogd); 创建一个看门狗内核线程工作线程/** * watchdog_dev_init - init dev part of watchdog core * * Allocate a range of chardev nodes to use for watchdog devices. * * Return: 0 if successful, error otherwise. */int__initwatchdog_dev_init(void){interr;watchdog_kworkerkthread_run_worker(0,watchdogd);if(IS_ERR(watchdog_kworker)){pr_err(Failed to create watchdog kworker\n);returnPTR_ERR(watchdog_kworker);}sched_set_fifo(watchdog_kworker-task);errclass_register(watchdog_class);if(err0){pr_err(couldnt register class\n);gotoerr_register;}erralloc_chrdev_region(watchdog_devt,0,MAX_DOGS,watchdog);if(err0){pr_err(watchdog: unable to allocate char dev region\n);gotoerr_alloc;}return0;err_alloc:class_unregister(watchdog_class);err_register:kthread_destroy_worker(watchdog_kworker);returnerr;}在watchdog_ping_work 函数中进行喂狗杂项设备和字符设备杂项设备的注册流程定义struct miscdevice结构体指定设备名如 “watchdog”、次设备号、file_operations操作函数集设置父设备等关联信息watchdog_miscdev.parent wdd-parent调用misc_register(watchdog_miscdev)完成注册内核自动创建/dev/watchdog设备文件字符设备的注册流程传统方式 要实现一个字符设备驱动需要手动完成申请主设备号静态指定或动态申请 定义struct file_operations结构体实现 open/read/write/ioctl 等操作函数 调用cdev_init()初始化字符设备结构体 调用cdev_add()将设备添加到内核 创建/dev下的设备文件手动 mknod 或自动创建设备节点。存在多个看门狗存在普通看门狗 Non-secure WDT (WDT_NS)由linux内核控制而 安全看门狗 SecureWDT (WDT_S) 由安全模块控制的old 设备看门狗和新的兼通问题if(wdd-id0){old_wd_datawd_data;watchdog_miscdev.parentwdd-parent;errmisc_register(watchdog_miscdev);misc_register 注册看门狗 misc 设备到内核misc_register()内核提供的 misc 设备注册函数成功返回 0失败返回负的错误码如 - EBUSY 表示设备已被注册。注册成功后内核会在/dev/目录下创建看门狗设备文件通常是/dev/watchdog用户空间程序可通过 open/read/write/ioctl 等系统调用操作看门狗比如喂狗、设置超时时间该设备会关联到看门狗驱动的操作函数集如watchdog_miscdev.fops指向的 file_operations。watchdog_register_pretimeout 中会确定看门狗是否支持超时预处理的功能若没有则返回0

相关文章:

Linux WDT 软件分析

linux WDT(看门狗) 看门狗子系统为什么要实现看门狗子系统?因为要实现linux底层对WDT 不同硬件的统一控制 在driver部分中最终回去调用watchdog_devwdt 代码解析 结构体使用场景和Attention struct xxx wdd_data; // 先定义数据本体 wdd &a…...

Urdf文件导出

下载urdf导出插件:https://wiki.ros.org/sw_urdf_exporter 1.准备工作: (1)质量属性: 单独为每个零件设置好材料和质量属性: 若零件由多种材料构成或结构复杂(如电机、电池、PCB)…...

计算机视觉(CV)实战避坑指南

做 CV 实战的同学都有体会:看再多理论、跑通再多 demo,真正落地项目时还是会踩坑 —— 数据标注混乱、模型训练不收敛、推理速度太慢、部署报错找不到原因、小目标检测不到、图像模糊识别准确率低……本文不聊空洞的原理,只针对 CV 实战中8 个…...

类和对象(上 中 下)

类 图纸 / 模板对象 根据图纸造出来的东西1.类的定义类就是把属性和行为封装在一起的模板。1.1 类定义格式^ class 为定义类的关键字, Stack 为类的名字,{} 中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#x…...

清华大学车辆学院团队推出大模型微调领域的新型强化学习算法——STAPO

清华大学车辆学院团队推出大模型微调领域的新型强化学习算法 近日,清华大学车辆学院李克强院士、李升波教授课题组与滴滴自动驾驶部门联合提出了用于大模型微调训练的 STAPO(Spurious-Token-Aware Policy Optimization)算法,旨在解…...

洛谷:P1424 小鱼的航程(改进版)

题目描述有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x 开始算起,过了 n 天以后,小鱼一共累计游泳了多少公里呢?输入格式输入两个正整数 x,n,表示从周 x 算起…...

往期精彩|EBioMedicine:MRI脑年龄异质性、认知、遗传学与阿尔茨海默病神经病理学之间的关系

摘要总结:该研究基于大样本、多中心、多模态神经影像数据,深入探讨了认知正常老年人群中脑龄异质性与阿尔茨海默病(AD)神经病理、认知表现及遗传背景之间的复杂关系。研究通过构建结构和功能MRI脑龄预测模型,将个体划分…...

ARM指令流水线的分类与比较(ARM处理器指令系统——指令流水线,中篇)

本文声明:内容来源于网络,进行整合/再创作;部分内容由AI辅助生成。ARM微处理器主要包含3级指令流水线、5级指令流水线、7级指令流水线、8级指令流水线和13级指令流水线这5个流水线。本节着重讲述3级、5级指令流水线。3级指令流水线到ARM7为止…...

Jellyfin在Android上的实战指南:打造你的开源家庭媒体中心

1. 为什么选择Jellyfin?从零开始认识你的开源媒体管家 如果你和我一样,家里攒了一堆电影、电视剧、音乐和家庭照片,分散在电脑硬盘、NAS甚至旧手机里,每次想找个片子看都得折腾半天,那你一定需要个“媒体中心”。市面上…...

基于FPGA的以太网设计(五):ARP协议状态机实战与板级调试

1. 从仿真到上板:ARP状态机调试的“最后一公里” 上一篇文章我们详细拆解了ARP接收和发送模块的Verilog代码实现,相信你已经对状态机的每个状态跳转和数据流处理有了清晰的认识。代码写完了,仿真波形看起来也完美无缺,是不是感觉大…...

SER5 Pro迷你主机实战:ESXi+虚拟机打造高效All in One家庭服务器

1. 为什么选择SER5 Pro作为你的家庭服务器核心? 如果你和我一样,是个喜欢折腾但又怕麻烦的家庭技术爱好者,那么一台小巧、安静、性能又够用的迷你主机,绝对是打造家庭数字中枢的绝佳选择。我前前后后用过好几款迷你主机&#xff0…...

C++内存池在Tick级交易系统中的5大致命缺陷:从L3缓存未命中到NUMA跨节点延迟,如何72小时内重构?

第一章:Tick级交易系统内存池的性能悖论与重构动因在毫秒乃至微秒级响应要求的Tick级交易系统中,内存池本应是降低GC压力、规避堆分配抖动的核心基础设施。然而实践中却频繁观测到一种反直觉现象:启用定制化内存池后,订单匹配延迟…...

【自然语言处理】从编译器视角看NLP:分层架构的共性与技术迁移路径

1. 引言:当编译器工程师遇上自然语言 大家好,我是老张,一个在AI和编译器领域摸爬滚打了十多年的老码农。这些年,我见过不少工程师朋友,一提到自然语言处理(NLP),就觉得那是另一个世界…...

IEEE期刊分区大洗牌:2025年这些1区期刊跌到2区,你的论文还值钱吗?

IEEE期刊分区洗牌:科研价值锚点迁移下的理性应对指南 又到了年底,对于很多科研工作者,尤其是计算机、电子、通信等领域的学者和研究生来说,除了年终总结,还有一件牵动神经的大事——中科院期刊分区表的更新。这几天&am…...

Temenos T24核心系统开发实战:JBase Basic语言从入门到精通

1. 初识T24与JBase Basic:银行IT人的新起点 如果你刚加入一家银行的科技部门,或者被分配去维护那个听起来就很高大上的“核心系统”,那么“Temenos T24”这个名字很快就会成为你日常的一部分。别紧张,我第一次接触它的时候也是一头…...

告别自签名警告:基于acme.sh为宝塔面板部署免费IP SSL证书实战

1. 为什么你的宝塔面板总被浏览器“嫌弃”? 每次打开宝塔面板,看到浏览器地址栏那个刺眼的红色“不安全”警告,或者那个需要你手动点击“高级”->“继续前往”的提示,是不是感觉特别不专业?心里还会犯嘀咕&#xff…...

Flutter 三方库 flutter_auto_localizations 的鸿蒙化适配指南 - 国际化研发的减速带切除术、在鸿蒙端实现多语言代码自动生成实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 flutter_auto_localizations 的鸿蒙化适配指南 - 国际化研发的减速带切除术、在鸿蒙端实现多语言代码自动生成实战 前言 【里程碑达成:我们已跨越 150 篇大关&…...

Flutter 三方库 shelf_open_api 的鸿蒙化适配指南 - 契约驱动的开发美学、在鸿蒙端实现 Shelf 的 OpenAPI 自动生成实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 shelf_open_api 的鸿蒙化适配指南 - 契约驱动的开发美学、在鸿蒙端实现 Shelf 的 OpenAPI 自动生成实战 前言 在进行 Flutter for OpenHarmony 的端侧微服务开发、或是为鸿…...

【ZERO-PAD】基于微雪RP2040-ZERO与QMK的模块化桌面宏键盘DIY全攻略

【ZERO-PAD】基于微雪RP2040-ZERO与QMK的模块化桌面宏键盘DIY全攻略 大家好,最近在捣鼓桌面快捷键盘,发现很多成品要么太贵,要么功能固定不够好玩。于是,我找到了立创开源平台上一个叫【ZERO-PAD】的项目,它完美解决了…...

nanobot效果展示:Qwen3-4B在QQ中执行netstat -tuln并解释监听端口含义

nanobot效果展示:Qwen3-4B在QQ中执行netstat -tuln并解释监听端口含义 1. 引言:当AI助手遇上系统命令 想象一下,你正在管理一台服务器,需要快速查看哪些端口正在监听网络连接。你打开终端,输入熟悉的 netstat -tuln …...

全栈可视化开发新选择 网易 CodeWave 开发效率拉满

一、什么是网易智企- CodeWave? 网易智企- CodeWave 是网易数智基于自研智能开发底座和 NASL 全栈编程语言打造的企业级应用研发平台,也是国内唯一的「全栈」可视化开发平台。它区别于传统 AI 编码工具仅聚焦代码层提效的局限,实现了数据、页面、逻辑和流程的一体化设计与交付…...

2024年企业级网络架构实战:跨地域OSPF与BGP混合组网解析

1. 为什么你的企业网络需要OSPF与BGP混合组网? 如果你是一家正在快速扩张的集团企业IT负责人,或者是一名负责网络架构的工程师,你一定遇到过这样的烦恼:总部和分公司之间的网络连接,要么慢得像蜗牛,要么三天…...

EPLAN端子排自定义:从零搭建到高效维护

1. 为什么你需要自定义端子排?从“能用”到“好用”的必经之路 我刚入行那会儿,接手一个改造项目,图纸里的端子排简直是一场灾难。端子编号东一个西一个,有的页面上是“X1:1”,下一页就跳到了“X1:5”,中间…...

KART-RERANK模型压缩与加速:面向边缘设备的部署实践

KART-RERANK模型压缩与加速:面向边缘设备的部署实践 最近在折腾一个很有意思的项目,就是把一个原本在云端跑得挺好的排序模型,想办法塞到资源紧张的边缘设备里去。这个模型叫KART-RERANK,原本是用来做搜索结果精排的,…...

OFA图像描述系统快速部署指南:一键启动Web服务,零配置使用AI描述图片

OFA图像描述系统快速部署指南:一键启动Web服务,零配置使用AI描述图片 1. 项目介绍:让图片“开口说话”的智能工具 你有没有遇到过这样的场景?手头有一堆图片,需要为它们配上文字说明,但自己写又耗时费力&…...

DDR5内存上电初始化全解析:从RESET信号到稳定工作的完整流程(附时序图)

DDR5内存上电初始化:硬件工程师的实战手册与深度时序剖析 当一块全新的DDR5内存条插入主板,或者一个嵌入式系统的电源开关被按下,一场精密而有序的“交响乐”便在芯片内部悄然奏响。对于硬件工程师和嵌入式开发者而言,理解这场“交…...

Ubuntu 20.04下WireShark安装后无法抓包?3步搞定权限问题

Ubuntu 20.04下WireShark权限问题深度解析:从原理到实战的完整指南 你是否也曾在Ubuntu上兴致勃勃地打开WireShark,准备一探网络流量的究竟,却被一句冷冰冰的“You don‘t have permission to capture on that device”浇了个透心凉&#xff…...

从理论到代码:YALMIP工具箱在双层优化中的完整工作流(含KKT条件自动生成技巧)

从理论到代码:YALMIP工具箱在双层优化中的完整工作流(含KKT条件自动生成技巧) 如果你正在研究能源系统、博弈论或者供应链管理,很可能已经遇到了一个让人头疼的数学问题——双层优化。它像是一个嵌套的决策游戏,上层领…...

【人工智能技术全景解析】从LLM到AI Agent:核心架构与多模态应用实践

1. 从“超级大脑”到“全能助手”:LLM如何成为AI Agent的基石 如果你最近用过豆包、文心一言或者ChatGPT这类聊天机器人,你可能会惊叹于它们流畅的对话和丰富的知识。但你可能也发现了,它们更像一个“超级大脑”——你问,它答&…...

腾讯优图AI解析实测:上传图片自动识别文字、表格、公式、印章

腾讯优图AI解析实测:上传图片自动识别文字、表格、公式、印章 前言 你有没有遇到过这样的烦恼?领导发来一份扫描的合同PDF,让你把里面的关键信息整理成表格;或者收到一份满是公式和图表的研究报告,需要把内容提取出来…...