时间子系统3_低分辨率定时框架初始化

简介:
//	低分辨率定时器框架初始化
//	调用路径:start_kernel->init_timers
//	函数任务:
//		1.创建当前cpu的定时器框架数据结构
//		2.监听cpu状态信息
//		3.注册低分辨率软中断
1.1 void __init init_timers(void)
{
	//创建当前cpu的定时器框架数据结构
	int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
				(void *)(long)smp_processor_id());
	//监听cpu状态信息
	register_cpu_notifier(&timers_nb);
	//注册低分辨率软中断
	open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
}

//	cpu状态监听控制块
2.1 static struct notifier_block __cpuinitdata timers_nb = {
	.notifier_call	= timer_cpu_notify,
};

//	低分辨率定时器框架处理cpu状态
//	函数任务:
//		1.cpu up,创建本cpu的低分辨率定时器框架
//		2.cpu dead,迁移其定时器到本cpu上
2.2 static int __cpuinit timer_cpu_notify(struct notifier_block *self,
				unsigned long action, void *hcpu)
{
	long cpu = (long)hcpu;
	//cpu up,创建本cpu的低分辨率定时器框架的数据结构
	switch(action) {
	case CPU_UP_PREPARE:
	case CPU_UP_PREPARE_FROZEN:
		if (init_timers_cpu(cpu) < 0)
			return NOTIFY_BAD;
		break;
	//热插拔cpu,才会出现cpu dead、frozen信息
#ifdef CONFIG_HOTPLUG_CPU
	case CPU_DEAD:
	case CPU_DEAD_FROZEN:
		//迁移其cpu的定时器到本cpu
		migrate_timers(cpu);
		break;
#endif
	default:
		break;
	}
	return NOTIFY_OK;
}
//	创建cpu的定时器框架数据结构
//	调用路径:timer_cpu_notify->init_timers_cpu
//	函数任务:
//		1.分配低分辨率定时器框架数据结构
//		2.初始化tvec_base的链表头
//		3.设置定时器的到期时间戳为当前时间
3.1 static int __cpuinit init_timers_cpu(int cpu)
{
	int j;
	struct tvec_base *base;
	//分配低分辨率定时器框架
	base = kmalloc_node(sizeof(*base),
						GFP_KERNEL | __GFP_ZERO,
						cpu_to_node(cpu));
	base = per_cpu(tvec_bases, cpu);
	spin_lock_init(&base->lock);
	//初始化tvec_base的链表
	for (j = 0; j < TVN_SIZE; j++) {
		INIT_LIST_HEAD(base->tv5.vec + j);
		INIT_LIST_HEAD(base->tv4.vec + j);
		INIT_LIST_HEAD(base->tv3.vec + j);
		INIT_LIST_HEAD(base->tv2.vec + j);
	}
	for (j = 0; j < TVR_SIZE; j++)
		INIT_LIST_HEAD(base->tv1.vec + j);
	//timer_jiffies记录一个时间点,标识此前到期的定时器都已经执行
	base->timer_jiffies = jiffies;
	base->next_timer = base->timer_jiffies;
	return 0;
}
//	低分辨率定时器框架数据结构
//	注:默认情况下,TVN_SIZE=64,TVR_SIZE=256
3.2 struct tvec {
	struct list_head vec[TVN_SIZE];
};

struct tvec_root {
	struct list_head vec[TVR_SIZE];
};

struct tvec_base {
	spinlock_t lock;
	struct timer_list *running_timer;	//当前正在运行的timer_list
	unsigned long timer_jiffies;
	unsigned long next_timer;
	struct tvec_root tv1;
	struct tvec tv2;
	struct tvec tv3;
	struct tvec tv4;
	struct tvec tv5;
} ;

                                                                 

//	参考 深入理解linux内核架构


目录
相关文章
|
26天前
|
人工智能 运维 安全
2025年企业级智能体开发平台应用报告:从工具到生产力的重塑
AI Agent正从“聊天助手”进化为“数字员工”,成为企业数字化转型的核心引擎。甲子光年智库《企业级AI Agent价值及应用报告》指出,2025年技术成熟与需求爆发将推动AI Agent在金融、制造、医疗等领域深度落地,实现自主决策与跨系统协同,重塑生产力格局。
459 2
|
4月前
免费图片在线压缩工具
在线图片压缩,快速减小图片大小,不损失太多画质
872 0
|
9月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课18 通过pg_bulkload适配pfs实现批量导入提速
本文介绍了如何修改 `pg_bulkload` 工具以适配 PolarDB 的 PFS(Polar File System),从而加速批量导入数据。实验环境依赖于 Docker 容器中的 loop 设备模拟共享存储。通过对 `writer_direct.c` 文件的修改,替换了一些标准文件操作接口为 PFS 对应接口,实现了对 PolarDB 15 版本的支持。测试结果显示,使用 `pg_bulkload` 导入 1000 万条数据的速度是 COPY 命令的三倍多。此外,文章还提供了详细的步骤和代码示例,帮助读者理解和实践这一过程。
376 0
|
3月前
|
JSON 算法 API
拼多多API跨店比价功能,选品效率提升60%!
拼多多推出API跨店比价功能,助力商家与消费者高效选品。通过自动化比价与智能算法,实现选品效率提升60%。开发者可快速集成,优化采购与购物体验。智能高效,抢占市场先机。了解详情:https://o0b.cn/evan
368 0
|
3月前
|
C++
什么是单项式
单项式是代数式中的一种
|
Linux Python
在Linux下升级到Python3的两种方法
在Linux下升级到Python3的两种方法
2026 0
|
API
uni-app点击按钮弹出提示框-uni.showModal(OBJECT),选择确定和取消
uni-app点击按钮弹出提示框-uni.showModal(OBJECT),选择确定和取消
2413 0
|
网络协议 算法 Linux
TCP 中的 Delay ACK 和 Nagle 算法
TCP 中的 Delay ACK 和 Nagle 算法
|
JavaScript 前端开发 CDN
Vue 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案
Vue 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案
3148 0
|
存储 人工智能 算法
图的遍历算法
图的遍历算法