// 高分辨率模式下的周期事件仿真
// 通过hrtimer仿真周期时钟,由hrtimer_interrupt作为时钟事件处理函数
// 函数任务:
// 1.更新jiffies
// 2.在irq上下文
// 2.1 如果当前处于idle状态
// 2.1.1 喂狗softlockup_watchdog,防止误发生softlockup
// 2.1.2 更新idle状态经历的jiffies
// 2.2 更新进程时间
// 3.调度hrtimer下一个周期继续运行
1.1 static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
{
struct tick_sched *ts =
container_of(timer, struct tick_sched, sched_timer);
struct pt_regs *regs = get_irq_regs();
ktime_t now = ktime_get();
int cpu = smp_processor_id();
//高分辨率模式下,如果支持动态时钟,则需要检查是否本cpu负责更新全局时间
#ifdef CONFIG_NO_HZ
//负责更新jiffies
if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
tick_do_timer_cpu = cpu;
#endif
if (tick_do_timer_cpu == cpu)
tick_do_update_jiffies64(now);
//在irq上下文
if (regs) {
//当前处于idle状态
if (ts->tick_stopped)
{
//喂狗,防止误发生softlockup
touch_softlockup_watchdog();
//更新idle状态的jiffies
ts->idle
时间子系统8_动态时钟(NO_HZ)
最新推荐文章于 2022-07-20 09:43:27 发布
本文详细介绍了Linux内核中高分辨率模式下动态时钟(NO_HZ)的工作原理,包括如何仿真周期事件、关闭和恢复时钟的函数、以及动态时钟数据结构`tick_sched`的详细内容。主要涉及更新jiffies、处理irq上下文中的idle状态、喂狗机制、进程时间更新等核心操作。
摘要由CSDN通过智能技术生成