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

被折叠的 条评论
为什么被折叠?



