您的位置:首页 > 运维架构 > Linux

linux kernel time management

2014-10-29 17:49 239 查看
最近看了下,linux时间管理,在代码中理出了一个线索,但是还有很多不清楚的地方,先把这些写下来,以后还会来补充的.

其中涉及到clock event device的注册,tick device的注册,时钟中断处理函数的注册,以及系统在何处从低分辨率时钟切换到高分辨率时钟的,这些内容需要配合kernel中相关的代码才好看明白.

time_init

    -->late_time_init = x86_late_time_init

x86_late_time_init

    -->x86_init.timers.timer_init();

    -->tsc_init();

    

x86_init.timers.timer_init = hpet_time_init

hpet_time_init

    -->if (!hpet_enable())

        setup_pit_timer()

            -->clockevents_register_device(&pit_ce);

                -->clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev)

                    -->raw_notifier_call_chain(&clockevents_chain, reason, dev)

                        -->__raw_notifier_call_chain(nh, val, v, -1, NULL)

                            -->notifier_call_chain

                                -->notifier_block->notifier_call

            -->global_clock_event = &pit_ce;

    -->setup_default_timer_irq()

        -->setup_irq(0, &irq0)

        

static struct irqaction irq0  = {

    .handler = timer_interrupt,

    .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,

    .name = "timer"

};

timer_interrupt

    -->global_clock_event->event_handler(global_clock_event)

============================================================================

tick_init

    -->clockevents_register_notifier(&tick_notifier)

    

static struct notifier_block tick_notifier = {

    .notifier_call = tick_notify,

};

tick_notify

    -->tick_check_new_device

        -->tick_setup_device(td, newdev, cpu, cpumask_of(cpu))//每注册一个clock event device都会创建一个相应的tick device

            -->tick_setup_periodic

                -->tick_set_periodic_handler

                    -->dev->event_handler = tick_handle_periodic

                    

tick_handle_periodic

    -->tick_periodic

        -->do_timer

            -->jiffies_64 += ticks;

            -->update_wall_time();

            -->calc_global_load();

        -->update_process_times

            -->account_process_tick(p, user_tick);

            -->run_local_timers();

                -->hrtimer_run_queues

                -->raise_softirq(TIMER_SOFTIRQ)//发出一个timer的软中断

                    -->run_timer_softirq

                        -->hrtimer_run_pending

                            -->hrtimer_switch_to_hres//向高分辨率时钟切换

                                -->tick_init_highres

                                -->tick_setup_sched_timer

                                    -->hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);

                                    -->ts->sched_timer.function = tick_sched_timer;

                        -->__run_timers

            -->rcu_check_callbacks(cpu, user_tick);

            -->printk_tick();

            -->scheduler_tick();

            -->run_posix_cpu_timers(p);

        -->profile_tick(CPU_PROFILING)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息