Linux内核调试技术——进程上下文R状态死锁监测

Linux内核调试技术——进程上下文R状态死锁监测

ID:39465481

大小:173.00 KB

页数:14页

时间:2019-07-04

Linux内核调试技术——进程上下文R状态死锁监测_第1页
Linux内核调试技术——进程上下文R状态死锁监测_第2页
Linux内核调试技术——进程上下文R状态死锁监测_第3页
Linux内核调试技术——进程上下文R状态死锁监测_第4页
Linux内核调试技术——进程上下文R状态死锁监测_第5页
资源描述:

《Linux内核调试技术——进程上下文R状态死锁监测》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux内核调试技术——进程上下文R状态死锁监测一、lockupdetector机制分析lockupdetector机制在内核代码的kernel/watchdog.c中实现,本文以Linux4.1.15版本源码为例进行分析。首先了解其背后的设计原理:利用进程上下文、中断、nmi中断的不同优先级实现死锁监测。它们3者的优先级关系为“进程上下文<中断

2、m32芯片都不支持nmi中断,也包括我手中树莓派的bcm2835芯片。从程序的命名中就可以看出,该程序其实实现了一种软看门狗的功能,下面给出整体的软件流程框图:该程序为每个cpu创建了一个进程和一个高精度定时器,其中进程用来喂狗,定时器用来唤醒喂狗进程和检测是否存在死锁进程,在检测到死锁进程后就触发报警,接下来详细分析源代码:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片void__initlockup_detector_init(void){set_sample_period();if(watchdog_enabled)watchdog_enable_

3、all_cpus();}首先入口函数lockup_detector_init(),该函数会在内核启动流程中按如下路径调用:start_kernel()-->rest_init()-->kernel_init()(启内核线程)-->kernel_init_freeable()-->lockup_detector_init()。该函数首先计算高精度定时器的到期时间(即喂狗时间),该值为监测超时时间值的1/5,默认为4s(20s/5),然后判断开关标识来确定是否启用监测机制,该标识在没有启用hardlockupdetect的情况下默认为SOFT_WATCHDOG_ENABLED,表示开启

4、softlockupdetect。于此同时内核也提供了如下的__setup接口,可从内核启动参数cmdline中设置值和开关:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片staticint__initsoftlockup_panic_setup(char*str){softlockup_panic=simple_strtoul(str,NULL,0);return1;}__setup("softlockup_panic=",softlockup_panic_setup);staticint__initnowatchdog_setup(char*str)

5、{watchdog_enabled=0;return1;}__setup("nowatchdog",nowatchdog_setup);staticint__initnosoftlockup_setup(char*str){watchdog_enabled&=~SOFT_WATCHDOG_ENABLED;return1;}__setup("nosoftlockup",nosoftlockup_setup);此处假定开启softlockupdetect,接下来调用watchdog_enable_all_cpus()函数,该函数会尝试为每个CPU创建一个喂狗任务(并不会立即启动主函数执

6、行):[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片staticintwatchdog_enable_all_cpus(void){interr=0;if(!watchdog_running){err=smpboot_register_percpu_thread(&watchdog_threads);if(err)pr_err("Failedtocreatewatchdogthreads,disabled");elsewatchdog_running=1;}else{/**Enable/disablethelockupdetectorsor*chan

7、gethesampleperiod'onthefly'.*/update_watchdog_all_cpus();}returnerr;}该函数首先判断是否已经启动了任务,若没有则调用smpboot_register_percpu_thread()函数来创建任务,否则则调用update_watchdog_all_cpus()函数来更新定时器的到期时间。首先分析前一个分支,看一下watchdog_threads结构体的实现:[cpp]viewplaincopy在CODE

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。