时间子系统8_动态时钟(NO_HZ)

本文详细介绍了Linux内核中高分辨率模式下动态时钟(NO_HZ)的工作原理,包括如何仿真周期事件、关闭和恢复时钟的函数、以及动态时钟数据结构`tick_sched`的详细内容。主要涉及更新jiffies、处理irq上下文中的idle状态、喂狗机制、进程时间更新等核心操作。
摘要由CSDN通过智能技术生成
//	高分辨率模式下的周期事件仿真
//		通过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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值