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)
其中涉及到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)
相关文章推荐
- Linux kernel Process Management ~Supplement(updating)
- Linux kernel Process Management 3.1(overview)——Schedule System
- 配置、编译 Linux Real Time Kernel(ZZ)
- Linux Kernel Memory Management (1)
- 10 boot time parameters you should know about the Linux kernel
- Linux kernel abstract resource management 解释
- linux-kernel-map,linux-memory-management,Linux-storage-stack三幅很好的图
- Linux kernel Process Management 2.1(amd64)——Creation and Switch
- Under Linux kernel 2.6.35, getting current time(accuracy macrosenconds).
- < Linux Kernel > Compile-Time Optimization for Condition Checks
- 在Ubuntu16.04-64中编译Linux-2.6.35.7版本内核出错[kernel/timeconst.h] Error 255
- Time Management of Linux
- Linux kernel memory management (ARM)
- Linux kernel Process Management 1——Conparison and Contrast between linux 2.4 VS linux 2.6 in process kernel stack layout
- Linux Kernel Memory Management (2)
- 在新版linux上编译老版本的kernel出现kernel/timeconst.h] Error 255
- Linux Kernel open-time Capability file_ns_capable() Privilege Escalation
- Linux命令详解 — time
- Linux Kernel Configuration
- Levanta Releases Linux Management Code (ZT)