分析start_kernel函数 位于init/main.c
start_kernel函数中调用time_init函数
在time_init------>plat_time_init------->ra_systick_clockevent_init
在ra_systick_clockevent_init中对时钟事件结构体clock_event_device进行初始化(即cd=&ra_systick),其中irq = MIPS_CPU_IRQ_BASE+cp0_compare_irq
ra_systick_clockevent_init----->clockevents_register_device(cd)------>clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD,dev)
通过clockevent_do_notify触发框架层事先注册好的通知链,其实就是调用了tick_notify函数.
在tick_notify函数中调用了tick_check_new_device(dev)(检查是否需要更换clock_event_device,td=&per_cpu(tick_cpu_device,cpu)得到该CPU的tick_device)---->tick_setup_device---->tick_setup_oneshot()----->tick_setup_periodic---->tick_set_periodic_handler
在tick_set_periodic_handler中dev->event_handler = tick_handle_periodic
tick_handle_periodic----->tick_periodic
在tick_periodic函数中完成
如果当前cpu负责更新时间,则通过do_timer进行以下操作:
更新jiffies_64变量;
更新墙上时钟;
每10个tick,更新一次cpu的负载信息;
调用update_peocess_times,完成以下事情:
更新进程的时间统计信息;
触发TIMER_SOFTIRQ软件中断,以便系统处理传统的低分辨率定时器;
检查rcu的callback;
通过scheduler_tick触发调度系统进行进程统计和调度工作;
tick_periodic---->run_local_timers()----->hrtimer_run_queues
在软中断中会进行以下动作
hrtimer_run_pending函数接着通过tick_check_oneshot_change判断系统是否可以切换到高精度模式,
最终在tick_init_highres中通过tick_switch_to_oneshot将低精度tick_device转换成高精度。
转换的过程中貌似只是替换了回调函数成hrtimer_interrupt和设置tick_device的触发模式。修改中断触发时间在哪里修改的?
clockevents_set_mode函数修改了mult值
分析clocksource中的mult和shift作用