linux kernel time management

本文深入探讨了Linux内核中的时间管理机制,详细介绍了time_init和tick_init等关键函数的作用及其实现过程,包括时钟事件设备注册、周期性中断处理、软中断触发以及从低分辨率时钟到高分辨率时钟的切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看了下,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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值