进程调度之tick_init

本文详细介绍了Linux内核中时钟源(clocksource)机制的实现原理与配置过程,特别是针对2.6.23版本内核的具体实现细节。通过解析时钟源对象结构及其配置方法,展示了如何计算时钟频率,并深入探讨了tick初始化流程。

clocksource 时钟源对象,一个例子是

static struct clocksource clocksource_hpet = {
        .name           = "hpet",
        .rating         = 250,
        .read           = read_hpet,
        .mask           = CLOCKSOURCE_MASK(64),
	.mult		= 0, /* to be calculated */
        .shift          = 10,
        .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
};

计算时钟源的频率

static int __init calibrate_APIC_clock(void)

static unsigned long pit_calibrate_tsc(u32 latch, unsigned long ms, int loopmin)

 

如下是2.6.23的内核的实现

 

void __init tick_init(void)
	=>clockevents_register_notifier(&tick_notifier);
		=>ret = raw_notifier_chain_register(&clockevents_chain, nb);
			=>static struct notifier_block tick_notifier = {
				.notifier_call = tick_notify,
			};
				=>tick_notify
					=>switch (reason) {
						case CLOCK_EVT_NOTIFY_ADD:
							return tick_check_new_device(dev);
							=>tick_setup_device(td, newdev, cpu, cpumask);
								=>if (td->mode == TICKDEV_MODE_PERIODIC)
									tick_setup_periodic(newdev, 0);
										=>tick_set_periodic_handler(dev, broadcast);
											=>if (!broadcast)
												dev->event_handler = tick_handle_periodic;
													=>clockevents_program_event
														=>return dev->set_next_event((unsigned long) clc, dev);
													=>tick_periodic(cpu);
														=>update_process_times(user_mode(get_irq_regs()));
															=>scheduler_tick();
																=>__update_rq_clock(rq);
																=>if (curr != rq->idle) /* FIXME: needed? */
																	curr->sched_class->task_tick(rq, curr);//Sched_fair.c (c:\linux\linux-2.6.23\kernel):	.task_tick		= task_tick_fair,
																		=>task_tick_fair
																			=>entity_tick(cfs_rq, se);
																				=>dequeue_entity(cfs_rq, curr, 0);
																				=>enqueue_entity(cfs_rq, curr, 0);
																				=>next = __pick_next_entity(cfs_rq);
																				=>__check_preempt_curr_fair(cfs_rq, next, curr, sched_granularity(cfs_rq));
											else
												dev->event_handler = tick_handle_periodic_broadcast;
										=>clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
											=>dev->set_mode(mode, dev);
											=>dev->mode = mode;

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值